{"_id":"@atomist/sample-sdm","_rev":"260-00898e48e4e0b148aa69ab400e194ec3","name":"@atomist/sample-sdm","dist-tags":{"latest":"0.5.1-extract-packs.20180608121712","branch:extract-packs":"0.5.1-extract-packs.20180611043815","branch:spring-packs":"0.5.1-spring-packs.20180612193345","branch:master":"0.5.1-20180629163828","branch:nortissej:spring-pack-options":"0.5.1-nortissej.spring-pack-options.20180615180227","branch:nortissej:client-as-peer-everywhere":"0.5.1-nortissej.client-as-peer-everywhere.20180615222755","branch:nortissej:break-out-api":"0.5.1-nortissej.break-out-api.20180625025617","branch:command-simpl":"0.5.1-command-simpl.20180629144429","branch-transform":"0.5.1-transform.20180703021719","branch-master":"0.5.1-master.20181101044648","branch-new-build":"0.5.1-new-build.20180706014225","branch-nortissej-createTransform":"0.5.1-nortissej.createTransform.20180710013505","branch-lieven-reenable-local-deployment":"0.5.1-lieven.reenable-local-deployment.20180713084032","branch-useCloudFoundryPack":"0.5.1-useCloudFoundryPack.20180817020839","branch-updates":"0.5.1-updates.20181003154209","branch-learn":"0.5.1-learn.20181103075331"},"versions":{"0.5.1-nortissej.less-verbose-addHeader.20180508011719":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.less-verbose-addHeader.20180508011719","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/SkHgerlMaG","@atomist/sdm":"https://r.atomist.com/S1PzKRXa6G","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f927e710e8e28460eb266e7c147ad8f09f9faa23","_id":"@atomist/sample-sdm@0.5.1-nortissej.less-verbose-addHeader.20180508011719","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-T1vNG4pWtsVfSd1Y8aqq97Wo7kWSkKXk6DnHj6YIeTbcb2FUeuxfbrrTDqN/PIl7zJO8eedRsEj1bjJ6O6Tjuw==","shasum":"819a1ec869dad9bf87df871a0682a7a31279da01","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.less-verbose-addHeader.20180508011719.tgz","fileCount":242,"unpackedSize":456317,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8PtdCRA9TVsSAnZWagAA70IQAITWJr5jLx93VRWIP3i5\n+Qu0/CeJOVZEqUV8XiWUaEd8HDyiS7eb+tVFoZ5fDeaONN9BhUcv1vy/1hSL\nIUdlPhQbABNtuN16NpmbA1O3Tga0OH24kPlPhbkT3dDV81IvTp5Cu4GDYXkY\nfzfY8KYRsAjUMA6dGrhU8B33VOaIUeb/IZilewXxUKMWqt5M9F9Qu2ZDdqqP\nFXHjUDdobFgAmVNayZ6EECIhAK3DnuOROV+8SB6nOcNqo7FZwUyCqqxmG2Vs\nABnn99LSxzt+Ighp7CwrUSfISPIEMZc4zmFaCkr4FDXqSW4XtS3CzfImund1\nhmQEzpm2HLB38zsn8KO9oJViVoJIfqabB/KKyBdUISbDs2sXQ4eQDoVrwb93\nzBJB5nKIBAMOvKWmDDIKO96sRYlSkr+IfpFcTOvRHY/vHbot9D3nDKVxz3fV\n1JxYlYBpUmcieP5LeHIl/k234jIvpgtNOWhljW7joD1goLtzY3Zaa6+eTZDH\n8ScmAElCs2K80ImQ/JlYk5H8ndw+2SBviLz9ngRnYvIUN0w0CBHYSNuDbtNa\nX7wkaI3lIKgVrKNEQNQmQM5g4IhTdoRgTtsZQjkY0I7fhBfDQvEJWH6G6a1Y\njezaCXti/T+LHkgl+sMoJ4rjn0carzr3EyAK7ZhWHOPo/Pf5OSbnZggzkdJU\nIPMf\r\n=nyeJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHyx+tH2giLW+LZzO32X/8OkYVSi5UBluiIwWLM2QpreAiEA9HR/2zvAO2c46rlOUaPwTHwzhtnF9F8POZMjd9nlWZ0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.less-verbose-addHeader.20180508011719_1525742428165_0.6671012197836197"},"_hasShrinkwrap":false},"0.5.1-20180509192856":{"name":"@atomist/sample-sdm","version":"0.5.1-20180509192856","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/SkDUQkI0Tz","@atomist/sdm":"https://registry.npmjs.org/@atomist/sdm/-/@atomist/sdm-0.0.1-20180509012335.tgz","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3ff238ff481441f280a0ac93c4f9048b4e44fb75","_id":"@atomist/sample-sdm@0.5.1-20180509192856","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-mZwEowafXXlV5aXX4AhRu78dff19YCEZW0V0uaMuhhq7Fb0IiyCdQoOiaFr9fGMSolUnQy7UfZBWl3/Cv94TDA==","shasum":"95c2745763bbf5688a210a307a45dce8239488cc","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180509192856.tgz","fileCount":251,"unpackedSize":467352,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa80zYCRA9TVsSAnZWagAAJzQQAJyPxbc7L5FZSP1LbRqw\nqoZpTYdmCIyVfD7mIsLtwzaZ00ziBHNXRB8iCplz4QM/DEp10TxeE4oCmhkm\nFthyFNtwfCn+ePZtUfo8eSBSDmreQww8OAMw6R1ISirV3YFs1809KwuNzLbl\nHOlxoBlP5W1oj5TQnuhhL3RRU3QR+dnVtc6WAjRPU+fqm9+SrS0dBJaJctn+\nk/Kac09LE96okk/ehw8P9EBIfZ8uFhu3IIDaf1UVKXuBQu4j7okOswBzJdmU\nWzONFA2d81P0a9FJtkJvYLJrHnbWclfvhlYrmwR9w2LNQ23wuewTmD8LFep0\nQYW/EPZQIhWXXzcFiGZI9hsfuQsd4wsLVj3IhSrsi6val7bZJoBqYLPA7V06\nmfIDtbIfi2iVKxvCIT3nu16y9ZLXIsm+9+STG5M+a1P8jjRrN8WOS6eg+Pyz\n8kszZSvClQR7+6kkji9rqgQW+qzfbbf+pbhnVJi6/jp/uPdM6mcMt2NhtaGw\nWXaXuXY5TlApPFPwtFHmkwM2ocLy+OtBfLTv8+T4wmTiCQH7urBUwOwb7Xvh\n/TOupSNZGgdcnZ1Xw5VFjRmOzsRPNueDKSZbNpp5EaMofVaK12J67AIMZB/o\nMaq4xysu/MtQfv2CLgqO1tY3q5eeFkYPBUB+WaBj9OUw1U3jhXnV+SfIXBsA\n1f2m\r\n=dEgo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/cXVD/Cl48O7W6KJgqsBp2ajJpoXjyvYRzzpCTZNtPAIgfwB5kQxOtFac7qStvr4FRUS+4uXpBjjm82F6UfYd4L8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180509192856_1525894358420_0.4564102937715204"},"_hasShrinkwrap":false},"0.5.1-20180510000937":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510000937","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/SkDUQkI0Tz","@atomist/sdm":"https://r.atomist.com/S1BVUK-bAG","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"8ef6c4d913dae933ccc8a89d110efa877ab75371","_id":"@atomist/sample-sdm@0.5.1-20180510000937","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-BZ9g5jXSXKGD8fu2rtG2VqnhOtoUQCRuV2aSYn6b45lSzKIps5tqJx0qO0m+m1sTLCXAGeF9/lW3+nyF98j1sg==","shasum":"78b702177994b5b4f8f42e6cd19819553cbeffac","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510000937.tgz","fileCount":251,"unpackedSize":466954,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa846hCRA9TVsSAnZWagAAqCMQAJmzhv72qmTia01/DNS1\nID74uOJceJOKalT9WAPNnIanoStKjpLqlGy5Rqu+gaA0honGo14bFTIriaoL\nWKQM7BA8nCURz/HpcsUG16ULOI8/EB7TTWfVHJsp2oGo1xC8BNVaDP3AbvYt\nVyCwqC60Yi7tHhzl7W/PfKJEhhYzkgce3P846Yr9uIzmkAjh31XRtuA0SOzG\nBmmGKH4hWvSfsiJiz84a5zmoilP3gQz74Oz2+IhJN92KHXkC6MI7BLG70St6\noqXJPxEcHTPmfNEckQ5/HukLw6Nud9Z65pSuapaqEyf7CPLCH+DgmJiaeCec\nbYVlv4np00hmj8CFIlFM1ETKy4HUB7MYmdJDVLSYUk0uH4+tJX2NW6EFEEHm\nPSZW4oQQOS/VPwRY5PTXVtiBKhoomyjMLNfaUA0OsVcwArBu3VAJgxpyNTVE\neIBd2OE6y5OZQFwMoHO33qaDuvq6xKkjte3v2QVHJDPNn1YYtWXlmeSPjiLd\nI6rvgEMBcAiUXnHUCuHBuOp/BHixqFqpPTkiYEVnZ7ib7s68ojrcjmHH6xJ6\nC5g/Ec0cFnz0liwYTHoKMgCeQdLmkWJEWGoelxrBB7CohTKRPzmKhfUiUVOe\nfcuLaLK/Q7LfePv5O/2Me7O1GjW2Kghlm3jsqS3GP/P5vR09ByU1r4xn90rW\nASOI\r\n=6ITO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEL4PCayxOEZzervq4CbveqzI5gDSbMZAIfX036a7lKWAiEAoBrceBhP2WSb4jxEg0Ino8iRJpLzeDrKeAxmcFiKeQQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510000937_1525911199419_0.39096766321245124"},"_hasShrinkwrap":false},"0.5.1-no-env-vars.20180510023902":{"name":"@atomist/sample-sdm","version":"0.5.1-no-env-vars.20180510023902","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy47cpbZCf","@atomist/sdm":"https://r.atomist.com/ByNPdRMWRf","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e8b61d590dc1b13589d1eff5649083b96093252a","_id":"@atomist/sample-sdm@0.5.1-no-env-vars.20180510023902","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-DidE+EiXdLwNIfBH6jOnIOfi+K5SBCOroOblli0hUtH1FUhD5VJztSKhFp+z2u9H0tZIFzhKTn0GqwaBg7ORNg==","shasum":"2aedf8205e17db6fcaff8597dc92afe9978960c2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-no-env-vars.20180510023902.tgz","fileCount":248,"unpackedSize":459140,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa87GECRA9TVsSAnZWagAAxOEP/3qUtBSkt+woZDMM5B+A\nJKLOu/8iYNrMUChrhlURQRxABYAj1xMa2CHVxIGT9I0I8Uqqi6jTKjB0NWdz\n8k8xME8wMKijcrw+oKVgUWagJaRXZ9DV5En7tNQTcDnGyYaggFVXiJCvzC0D\nhUji/UHJ0gRvLgYsgHPPxUNgQanxlx6nDivFygr19U2G9WyXlmIV5H/Xhe01\nEDRO7SRfsFPhTpE6Y7Ase2OpCCFYeQCEhXFs/lurKoWsTc52FK9tfgnMqkWG\nPCgyouzVbvbSAh8idIAlOvVbvofSwY6yqi2J96hu69ZI1+Jr14Z/Su1l8V40\n8v7dzk5z1J7je2hitGCtk0XTn2nN6xE8JDj/IaHlXuZTj4mJsnCxMz3lu6l0\n7bMGCeEG0rhHZz24TS8xJIe1doSKmT4A7Kep1yBioEhnq5XHigGmhdZsiumH\nGAuDhl26gCvehKw2CRBjsGF9WAKsmqLxTwpN4ggsbEmwkSnjIjuxoNGCrBAD\nGHRZMQsinpvV1dvnWLtQeG/niGRCJYvjrEnPICtM+PgQnoOo8uTUcvld+G9c\ngf9KYrqy86W/Lgz62UKbGR+AvsWeqCnMd3TNSAbBKSaelORg4+OFoAbWFCVx\n6hLhw0+xLY5hYDjCLX7dDvDSch5gsRX6aepWusQEcbeq2YDw+auPHnihlG3/\nWeEP\r\n=QEa/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCWP6HWxN5dTiQgajfo2qhik7PbJ2m7+VoCVB9QNK8v4gIhAOgU3BB4iu3W1W5pA/7XAJZsfKc7lMcp38uo2FeKAZSe"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-no-env-vars.20180510023902_1525920131510_0.25982506975170416"},"_hasShrinkwrap":false},"0.5.1-20180510025244":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510025244","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy47cpbZCf","@atomist/sdm":"https://r.atomist.com/ByNPdRMWRf","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b5e776d29943c14b781590343600aa6460320c23","_id":"@atomist/sample-sdm@0.5.1-20180510025244","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Xn74i7kQZD+P72uxlt8dlJbrAjZmUznbT8mBQW5kwREyavSInCFm5CR2Z8/65PW4kh9rQ3c5Xohk/jJd7r/mLg==","shasum":"c9db5d34f44bced919580fcbc4b6df30f727d8fb","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510025244.tgz","fileCount":248,"unpackedSize":459128,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa87TECRA9TVsSAnZWagAApaAP/RzT20Iy9jS3MORcLUp1\nXkj/4Ui4soegyb31FHtMqhHDCszLZZOGa6odfClNlYiKGAD0Qtrt4ORXYXY+\nBhEgo+gj0VDROsELUvqrZIyf8AOFH9TxKl4K4eO+AQdVlf5ZZTWI+S9ap8sa\nIuL3HwScVRr8LjrA2luqf5oQpU6LQBzV/ng9zuSL4+i5dJPk5iG1HDmW+BWu\nVVMawajwHaVEWQ3GPA+iPm9Hlt0KZcvye8x8kpLtNJe//BsqtYVMrShVLXPO\nPs4M0dgxIaY4dHiX/R0xFvfwYdoGg1DLLcSXzp0z6ZsxlKg2TSa2l73OoltU\n/d6LQz1dGKDqa96uAwqp+OOg0WYBNg8Q+w5Si1b4a8tr8VEJTtyPrjhyGxNM\nlQI9Ms6URyZ7E9INHGkrCwXK2GhmB53eZBdAHnb4o+JUadXewRVB4mMfpCs0\nl7jhrTJ95jSg7WHd4LROdp5LpYgYp1WFIzq97HTOHGc8hW0K/gvav6xjn9y9\n08BIXL5YUtJE0jYNOKWM9VshBKpzugPlZcisPrFEwm3ltZNLHntJ+wtC5eLX\nV2gKFELBCh2RZgJaKyIXielzl9GT+JHEzNiLUKTdnVqTMSn518h4qkbeXHuq\noBeccY0LeZCnX3JQEaARqYR0tBWsvTqlJZicA5T8pkcdBjgDFxrOFLLnbhiw\n18fv\r\n=Ebq7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDixMNear299HTng0Shbx6zjFM8HY6tGCaVdEzdhnUwdAiAkVcwA84hJIl/nraVvQP0NbFIbUyrWV5FPrprJ97WjpQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510025244_1525920962931_0.6901816949247757"},"_hasShrinkwrap":false},"0.5.1-20180510025301":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510025301","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy47cpbZCf","@atomist/sdm":"https://r.atomist.com/ByNPdRMWRf","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"2c441f470580cc18f87c74f1e784d8a7903f3529","_id":"@atomist/sample-sdm@0.5.1-20180510025301","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lBCki2xrTrmGgOp2E5EuUv68czd/5IuHJ7ZlCYSl/+tHgP1sUVUBqjVMBMa/Jx2e4+T2FN1RSYz/pQByqfRgEQ==","shasum":"ece6c4cc5fe4d6a65ebccd5bed1a2cb05d43feae","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510025301.tgz","fileCount":248,"unpackedSize":460002,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa87TkCRA9TVsSAnZWagAA/lIP/i01NCTtBRoO/x51VUvw\nwB+KHSp2xuMeJ7T1TvS4YKEhsvUguPY0bu0z0qD4QOWGrguQHVMOI0BCp2kU\ncGBIDchLrleVMoTWVhC0R4ddVXWhwfvAF0tOAbOpNw541+G8bGnHI7c2UFdb\nJ3EmQusNszONIgOEtm7QeY91jvzWmjeBkEZurOC6FfOKppCn9BYy9o7KMziS\nTQH62VDE63c2dQ5Jv1l7sgxLjrk7HRLDS//2VGInd7U8ab16I88gBA5mylcT\nv4sgG49I9bOp9qe425Y6u1lK0bqcMsYctVcVMTUjZAzHijjH+w7UnyGUfdKs\nZUBlTmCI9t/G4u2gkyc9gvUSlY91QWlTlvY1SPUSozr7+kW7AkpZEt14pA2o\nUWEZRJIBGJM7yW6IMIz1SdDMND50Wmy+qdlkXdMyP66EvWWtylCQqAyh6i7Y\nZyQjjdTSK6ylmTUHmx7eJGU7FWD3/GiklPa+G8FKHG8RzbHLDRqVf0rmOBbC\nfX5io9cbyklCOoiIwLk8Te/eb2y/Q079j4YVvKEmtxPf7awCUPg/CCU1KHFD\n+fobxTKWAShLCot4We1/4hGj3pl0zS1Tedc6lHCzvAyUhAxU6PYU+M+yx7Ju\naKgsDIC+zcw2pdPpZT5HIZGQGL3dlONxvYHS74hUprjUdb5RZsWnEQpHuW2R\nE74y\r\n=3Tax\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/sqW1kmvuLF4fvn5N8+uMdLZWER3E5Fu2NYHSpWcopQIhAMtoyPW73SSEWHrwspzcd6MIOh/YMWev5GzlosLdkesn"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510025301_1525920995774_0.7595418103501046"},"_hasShrinkwrap":false},"0.5.1-20180510031016":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510031016","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy47cpbZCf","@atomist/sdm":"https://r.atomist.com/ByNPdRMWRf","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"fc8e776601ec162e2fc5d7c08dd15608f4d6e83d","_id":"@atomist/sample-sdm@0.5.1-20180510031016","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-uCDVX0QjKPHgmT4ExhI2Rgl/+fnOn5zYQ/RRZ2GQjrX22KpnuEHVmfvaI6c6h4T0k0Y3kU8oMgepme7AZDq3xQ==","shasum":"b0284d3aa26058d1e6615549c955d95e3143b86a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510031016.tgz","fileCount":248,"unpackedSize":459821,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa87jVCRA9TVsSAnZWagAAtX4P+wQWhSzhBnL9POHKZ1wT\n0X8b3mh2WIhF4xl1DOpX4FBSOsbFQP98Ev7wWCzNFoWomvMpa/ozyVyI8H2z\nLeJIJOF5LrBAROQgnqnDP579I6Ssc8e/mPbEqy629oLaxYA9bSISNBvNT4ie\n5uhZYwGLz0IH6x/cC9y2YTf58nOQCwwccN/C0bECg/wLnkS74hjwZOQII6fk\nrB8Uh/GSSszMCRBvb6awGlx2jAwR+XJblxZ9ZodJddr8RLb0jbtEHJwkPlYp\nPLOEZQDDT4U544knYfa8pcOzAvcG2qWgwb6qCe6vPBFJp07pnJ3oc1J/JMcl\nJuLXVd9hu1p0iUCKAYkLnvEYW8xEkZhqfS4aU9yMNbNvnbM/btvPTQII59F5\nmau4wjQdmNSc5nWvD+HV0yNkqgkVbkxhxE7x1Bp2GbeyzlzIwpzQvTDemTUW\n5ii8WbWEm0ydzNQe4qy5x93qrsk9StYB0VGX8vHqedHo78vimiQAy5kasm6H\nPf4GgawKvsL2ZLrc1q/fP7X9dfLBO2eQKoifYQWzym+2cH7VndE+K2noMMnc\nHpzUmZEynn4WIm4yh1Di121Up+R3+yIdBK3hL1Xi8xm823t1B2jROQ0Oa4Pf\nLiJHlhtTG3W8t4A1VqUNhom8P8FeMrC9gRBYIFBi87Ug5CanPl4PMkvHNC58\nDe6j\r\n=Oxw9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFlHpv0aloh3CFNYJcAErrZgITRwr5VXXLHXQyGrvKAaAiEAgoUcqEYlGZ4tHxArO2NPc7PghpHfT1IfedgeJwWLi0I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510031016_1525922003914_0.5623098743551196"},"_hasShrinkwrap":false},"0.5.1-20180510031443":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510031443","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy47cpbZCf","@atomist/sdm":"https://r.atomist.com/ByNPdRMWRf","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d833379261a7e64ace8605f1b74d897d492f72f4","_id":"@atomist/sample-sdm@0.5.1-20180510031443","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lB4HdlinPOg/BAo3SWsSaOGiZ2eo6ULwDn66/j77VW6zyInAIEtT3VfWl3PPwpeAdG5k9ouzI8T2PXjvTsxBqA==","shasum":"2487206c32234252388fea6c24701342fc37d8dc","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510031443.tgz","fileCount":248,"unpackedSize":459561,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa87neCRA9TVsSAnZWagAAMiEQAJxy9k7FVH+4vq4Y3QDj\n+Gt86mSNfWRumzguyBAPwuY3KhLNn0v4cq/bDBF8RWwdIF5RdSJAVxwFAIN8\nwtauKBhquMTnAM0Ia8danaxwa/EzRf/q2Ib2v1sUI1n+kBx7gEj27QiIyUag\nzsa2VtGky/alF+E09h7l+kO+RUR6EyvRl/WMKdNRdToJhs1OcTBRokm6v1Lj\nMQNW/H52DPWQfqSasWjHE7BCP3diaEIal+lC5cLxcqbHT0QGdTbYRs370tAF\nUPzds9z586kdQMalgek2bZ/lk61IaEDaLwFCLMxbxhzsLI+26XvPb511cKrB\nNINn+cDBZ4+NoUuTcxbcHi+Qz7cIouhcsunU4HDnO4zTopIVNpGiI8I3kVlT\nD22AkHDuWC0ahPNntiPFXY8b5qouon5Qhymaf5ipfjPMI+jIZlYm/YYWtZRf\n9DXB6FOFSZ/a6GyqqZm6H8cjnwUbwLy3xolyn/FyCTg8IpJadmqFUncud1Hl\nQZmGl9nkVuvxQWk8mt83PIv/wfxnIA5rqNGLllMLpspdVlXMh86QRTC2rxm/\nsZ1aMVPKuSaghJ7kO5Cys2qsdE5txozgEQzsZqqVPYPQVxDsqL4tl/iGZu+F\nRsTlRvHy6LQPNP8Kqbj5durieD7ykxoYnyCiDyDHJh9/TjpPbrhfcVd2yL0K\n21mS\r\n=Za9A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC/JRfedGO8VDL5CaIbmqz0DmLf0G0bTVdBXteoUgcSUAiEA3KOaTb4HmH/p2Bp7U6BilDg1aaC/NlVsLu2uU9Va4NU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510031443_1525922269962_0.9589061226984483"},"_hasShrinkwrap":false},"0.5.1-20180510181057":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510181057","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/BJsogHbf0M","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1a675276bedee47267cfbd7536d26ef84966fa38","_id":"@atomist/sample-sdm@0.5.1-20180510181057","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-90Pxe/LicZTBFkD4xlynn08zkU2ZEmYw2PXcfice6cSsRxfGv+RMlS9k/pTBKIXL2xDYoq/5j61kXgdjqFV1Tg==","shasum":"e70b708f26abc00106057a413e242d931906c8a9","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510181057.tgz","fileCount":249,"unpackedSize":427700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa9IvLCRA9TVsSAnZWagAAl4QP/0TF0MLIPOEcsnnL9yRJ\nKUMcaR++dui9k3J2ALscfZwrEJSiTOIi4ct0H6n/s0IgS/w8OMrVz7P00/GB\nUVSDDKU/sDb2glJM62Wd+O5JkE99zquMXIkVwPyeRxRo3hkj7ZSUMj5ofbqR\nF3eurZ7tXnhXxQKaqE1AOxv8Lp1txxhsiHfgnnKI1+WldE5E4lsnFnanpmaU\nYXXIFu1v6EzTiCr9/oyX4QAhWKchFL3v1LSWGcvtfJEJUvQDSB7e2zkbKw/Y\nyVWGlouCfvHaFuHMer56RwCV5apDLrovh1SN399rwwzjrYAtGAlr5insnUvJ\nO3hgWuSHeU1ZEypJggNY3d6qxUONORZ8MeXcNBIR7XgVuf5SXWfFTcu55pFz\n6pamjoYNBKaDzQuD1KF/ZlnLbgF6fcHiwJJjQdnLw5nYuL8/jqM/4yRatMyZ\ns9tJluj11b9aKVTNYxucDl6jMbe/hA813CByjCd+PM+yDP+XmS8NX84VXy+N\nF2M0Gs+gXVAz68ROWWC7lXJBzvDO2pjyQXWLc9SvfX5ddZejHs0eEnIIKwTV\nsFhap61pXV+DCFkJ4qnm4QsWwwR7Wr1w3dVcHnaIH5S8Kvdf2M+DgxP2Dq7d\nkkR89vdLlN3ADVWOhAqwfCJwKichbsA+J2r7KNjSbzLGM5MXiwEyifrzZbxW\nZxaD\r\n=jfX+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIERuM2kVgGKsaldweorQo8RWFgghAedwnjwZ2vjeK0DsAiEAo3m5MIHxsk2zHiJmIPzjuNj1FZ+Xqr8IB9dwCTx4lsU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510181057_1525976009759_0.6727216724218534"},"_hasShrinkwrap":false},"0.5.1-20180510204105":{"name":"@atomist/sample-sdm","version":"0.5.1-20180510204105","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/BkV59BmzAz","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"5c90a49b53b7cd8d1b2103838128055af8764481","_id":"@atomist/sample-sdm@0.5.1-20180510204105","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-DTymLP6cVEjBgBXsyd3Uc8BjEFpZJvF+Cp5loO7vgrW0GQ15hnhUjGsBO61cDXmKkAXhBkznxppaikrJi7rfBA==","shasum":"1a19f5d975e94a7f6b00f13d9de6fc0499db26ad","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180510204105.tgz","fileCount":246,"unpackedSize":421602,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa9K7rCRA9TVsSAnZWagAAcWAP/3Mm3jiMStGZQVdgII6S\ni/PzNRJ2gg6a2DeIRkO8sr2eNwFkDzWI2WAvwBOQZEAJkQemzHYA/y6eUL8C\na2FnEfdmDEBHp31R4AtJDBDdHoMJ9NveqGNwGbXeM/481RVAfxI/eK6M2dPA\neOZHmhKQpg2T8P6XPwZF75eatYWagSM3mjHHyoaxhUO7nQg6t533cozzGiax\n0kP0Oo66dJoKlPQs5baOT1Ro56XAShjM7DM8Idfmj4wurUaOEP/6NIHgKawJ\nTO3Jxx4QLodQbLHbUy2d9kteejC7lqEJ1thEaWlQKr68EFJC1J/Jr6tFuqyJ\nWggPpR8ubyJ7UTS6WVfNQ2b2fhzt6EH3t09veB6AJsHWLBu5lrb6ledjTFI1\nqPJuYNbaHau7pSzHTYAOrUeEL1dLqhjeutA9qMVeUl51aDkgWpbhodTi6XeJ\nNGRFlhze7c4SMMdei/JSsyIcm0WVmwe8Il+4UaLBLcexrdaal2mX0H/BDBwL\no9XSkn5seV18L0zc6yHnNd77A2vZUKsz+zYJjWfaQ2Ga1saVg399HKGPmVDh\nX+TJ8nitKRj9+W8bijsPeHWF+NizRqrc/B9U5Dm2fhF9TTtZpJw3D9aHhiWn\nuctkDRqDp9RB5Z72SryshwyzECOHbRvgzsn9dFJCf3fqd4v0d0ReEYbLjwqs\noRoF\r\n=J2Xp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCA+hSYrq24sIxXrU9QHMP0inW6PuEbwpY1jsRK4FpJ2wIhAM5LdX6tF4mdjVzD2gI1xjG3weRZquPECQTW37136RN0"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180510204105_1525985001447_0.859478569958815"},"_hasShrinkwrap":false},"0.5.1-20180514115901":{"name":"@atomist/sample-sdm","version":"0.5.1-20180514115901","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/BkV59BmzAz","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"34a4d7ad3c02427263d9c783ffd2a068990fdada","_id":"@atomist/sample-sdm@0.5.1-20180514115901","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-i7pyZuWf6PJ1KpV4LSHGeDsu3kCv6syZisieih7KN/JG/2RZeWPgSHpmxRHqBC6lgsUAA9TpX5zzcYXvnZXSbQ==","shasum":"4112e1eb54ac5e99c238b8177c6b2292d1714005","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180514115901.tgz","fileCount":246,"unpackedSize":422217,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa+XqPCRA9TVsSAnZWagAAt5IP/j2im28gJPFGwlgN3E4E\nOls3ZAWiVvSVYOu3ffclxhLRRuNEORgA/rG3Ts0xqxgiepNzLurmvmg9rhCA\n3r/L8yjDWBY34vB81VNF/rYLCM8BTauM+71FRpwm6VhcO/K6KtBdEqb3AyIN\nf4YxqTMGzchjdq9Z4mO16PyAwuOBTs9LcUqmp3y+zSlQ8GnGCi01/6UUofiD\n+EWHMeNMVkIq8mnfI477rdeDhbmMQphXxAiFqcP8LMn0+wkfG8KS4DPlKg+S\noYSn5G/MPLqNLOqOe/MVkrGPW0O76BMDcaXsTl7tSi+rRIKW0izcFUOecDUg\nJBZZ3npFdIXE12pmUPxlhceUPvVBlCgjI+a7XTiTbL7wrcwx8XmDKq8ziV7F\nCYpObUrc0l0/HGnKa0I3f0sqOscNKLmdjXK73BvpMDOsUQrgawWI7lmEIzEU\nl+7Fxl4/OIEx/FTTyF5x8qXVHplUXSHSRd8rS5XR37F3+uLY5EgmUkt2wTSF\n095r5EZBC30AXRi/FBVLtJSxpTooSezEpnWe2WYriLOEqoTMW38FLJDi4kn0\nhpN21E2yeiP7vq+CpdOXbupV9ZlqnrgPTQDCzpR+ua3iLv00YGvpKJdk2eRv\nvS3tolViEzRuN5hucJSBG4EANGuE+K9mfo5svvuf4uo05dTNPr4AVY7yksBx\nJDjY\r\n=UxOj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFFDGGqIz+Gga6DDZwFE+KnzjB7Y5NvOnFw9kbUH8tr7AiEAqCiIpLbXua939cxpQWikouEz8D3gFs4f+1fqoxJ7UwQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180514115901_1526299277147_0.14485141497432985"},"_hasShrinkwrap":false},"0.5.1-20180515155531":{"name":"@atomist/sample-sdm","version":"0.5.1-20180515155531","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/BkV59BmzAz","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e6e7b5d2c5ab3ec4a7892929197e130b81e94ef8","_id":"@atomist/sample-sdm@0.5.1-20180515155531","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-VjSyihI9VXKJAhkYlqdmxtKh0Ff1guu32kniY3j4kgM8bCI5JE5bxRL9B5gyMvBW+7u6HwVXDGWm7wa0+rOOtw==","shasum":"0225207d896efc299cf03a2e9f11ba88e5a227c3","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180515155531.tgz","fileCount":249,"unpackedSize":437795,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa+wN3CRA9TVsSAnZWagAAPagP/2lnJZ1ESzyiwPqB4f7f\nGtcGkZ8wahFVBMmjKcIppR3dcneX8890XCdls/xGe2JbLmO892y50WCXIzCN\n3a+xUTuI77RgvGsoEXnKq8rNuwaPS8K3WnRcsjH+Hegx7mhxPNxmjxxIl33l\nAJDpoqRoS++46dny8TRU7kONmEKIt0i/zBed3XB8Xq6PzwwvTARYTNdt7zwy\nQxjj7A9JCVUZOHG3XKiW4b1d5NCtBb/QntNfBmfdYlY1B96Y0uEKDlN9QArt\nRB8atJ7zeKk7o34F5vTSTzPmS4oXzSAawRzG71oqQLfoxnQ9R9PRnX8GX10w\n0tclTV+hZID9q+v6IjLfQL1UF2bYUrUzD/XCFTtWMwbsBmocwi6FmCKL7Q2E\nC3MdeMKX/ZrfZUcnRrAfcdJNZ/qQYPuDxvEY9kCEjE793jAe9rafs+Ly29Xt\niT0JjuTR/z418s6doNMm7M1nqPIUClsv0uhdCQf18Paj2ScKua8p42U9EmKZ\nYANHk3Jbl+4JkXmJ4qI24IZbq8x4KtuNIwpTfY3Vq/5x6roNrklNR8ztvX4v\nKBz3oSmVBq+vHmBkQc/w8Fc+6Np+oeP+5JxN9gQePt1tXZ/meQ8XlyluYORC\ntmMAIyOMKyR6s517nt6gEX2nEa1P0ynPT0CL+kFomSCoLE544LR3cTlZtSfx\nowbn\r\n=5nMh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB4zEkxhBnVSiBadbVgpSbDv3l0INEiyglpKAW6HLUY0AiEAmwc/9f/XTsX++rg5RpXiaztr2Egpxta2tBgoCeqpaNo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180515155531_1526399861788_0.12750450222950538"},"_hasShrinkwrap":false},"0.5.1-20180516101450":{"name":"@atomist/sample-sdm","version":"0.5.1-20180516101450","description":"an Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/BkV59BmzAz","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"97099d1480d937ed771ca3ae913b5ae22ede037f","_id":"@atomist/sample-sdm@0.5.1-20180516101450","_npmVersion":"5.10.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-4FOuaHjtQ3mUe8DpteLGZowo9UcwQQEucPHHKyQerkbJ+q6bOY6CRvGigKS+eRNQzv6bqtGsXBnVsLFuLdk9bA==","shasum":"2f465a32fca2cb73898493258773231064f808b1","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180516101450.tgz","fileCount":249,"unpackedSize":437563,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/EtUCRA9TVsSAnZWagAAVMEP/if3bDCgrABrkCQcbbZg\niCGG8w17O+Vb9d2XKJtwLpg3+JQd0mUj2Xt3O9TDDrPdrR7UWNHPXyQm9TWA\nLkV8ovXj9ezrbxdDQJHsUp9A+3QNxehpDSOzMcm2FEGY4jjB1YGCc0y9V/Pc\nLTJDDXCpRJ1ucI4zuCfrUDugKOhevP6T97IHyVO6Qi/53iQMT1VLEnA24Y86\nst9tkLvE/SqpqSQ2CBDzMBromMP0Zb6kU4pkfNgoXgM7MqnHxsuVdJiVBUrm\nxi7R1m9b+v+oCD3h388TlPZr/KsBBFUuer4dEciHJNoqMZAjnDeYZnS/l2OP\nqTemHACeuNaPFEximz9MSTxQJpHAU6LMDpIkFlKRzBfj6Ip3kIBJhXHsrRko\nnfKUH6S1bZ9vdN2BSjzbq6Gflu/s08TtgaZhrl1VNu0ECrz/6BlSewBTIcDh\nHUKwA8i9Qd4Gq9Boad0LaBqH8LsB+fBZ0+ZRNOgx0kGzSeaW/0hz4y+NMDwX\nwOI+nlKeBHqJFmlgrLZaccrI+h6H9pSQUctxq+/z3Lzj92F1US3y8wrO8ohJ\n65joL611D0oFdnxbMX08bOCPIbg3aC+p1IS2CjMZ9X6QNQAzjfn/BfGurENn\nXUAU8uycfFlL8l5Mrj5YKB9bWHieG19Nje91RMBZ/krWtEDflr0fgAlUgSkl\nQebU\r\n=5Lw5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC34abVJe7Em4dzEzVr6xsvPUPvRXPtiJDxoCqSK3QqOAiB4T9o67xY1tJGQa699NtUcaJPbPtMZzMq77M32mtZ6Mg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180516101450_1526483794721_0.9176699505788215"},"_hasShrinkwrap":false},"0.5.1-20180516113146":{"name":"@atomist/sample-sdm","version":"0.5.1-20180516113146","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"4f7cbc35d0769ec31934fc1964be6dde839a6d04","_id":"@atomist/sample-sdm@0.5.1-20180516113146","_npmVersion":"5.10.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Ttlta+86b9Ve+GE8Wh9rVc+VwtCbKQuRh3Lk6afGLXRaauQLWJN1DAc9ok4LapG2ID6UQlPscl0aCxpuybyQLw==","shasum":"fc7b6bb99bfc51473c44d18de1b6bc6d2608c2bd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180516113146.tgz","fileCount":249,"unpackedSize":437586,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/F1ZCRA9TVsSAnZWagAA+wIP/00IZ1nfDLWXlVnUPxGf\nbptRDxXhaAnOZPgGclHgsm5wJzfTxgV4M1DKoLVKUNt0VHZZKMgWa00hJ/yl\nODAJ6tPIoOcK9E+4iNZRTcOzH6wgJZLhS/dzM9yuHFfEq06PSmaTId+aksQi\n5U9Vad4ThzovtlldTbuyoCMh5ZodweDCu3SDUHOaHABNsLYghQShnR6ULy2h\nXOszxo/14nZEDQUftE5aWz6OEf7TUxOEuSC8HARGwv+pAR3zWUViFO6MM61J\nwCDIBT4i3qmTlxW17auqWpg0bBeV5qz2JN97IaPr0O4c4O5o4e+h76t3aF4m\ncAhsf7b8MbgenZKbMjkOWYD8BCv6bY1GDHDTUIF3hzelJdw5N+1q+o+zv99M\nUFrPKyiJrtcoiZNRZ/UZ4omyBvBKoZoS0RjN7EnvZyo0vRN404INL1JwRf8t\nNQAdtd/CXruyawVfZTutvBeIhBnxKf/ewpqUs5q01IW6HMt/xU9CryVPSLIm\n0MunfHN9v6mfxh0vqXxRpQFcvXr/JTmnq8zvjof9zIXNwjjRymnQPBXsYJ0w\nFFyWlA7EL1wUlK7hTk2Qo8omU00CzqSW/jbeBO5IrFxiTEHN7dnJ1vKz/H8m\nQjVmH1bahjmU051u4B5eOJUXBiTT8hfZ/to/QJaBasaBeGJpj6VBHlCgbpTH\ncB/f\r\n=mXsr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHqkQ1CEtO9lKpVVleI+tIQiHfEdL7npVC1U8zddJ15mAiEA8OHhxekmBLHnOOa8WzafcMmkAaZbF77nJ/i2jrKapqM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180516113146_1526488407114_0.12088023615030274"},"_hasShrinkwrap":false},"0.5.1-20180516173738":{"name":"@atomist/sample-sdm","version":"0.5.1-20180516173738","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"8bde960ecd6ca2ed62c1c82dd47288ef5963c18b","_id":"@atomist/sample-sdm@0.5.1-20180516173738","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-hkPeHfhuMAsmNvKTQKqtCxzhjSU4azk/hW86zMXgD2PkMfngoV0q9wBAtIn0KNF656P/DASq05RBkIFfqR4YzQ==","shasum":"c06f93428472927f7b283518985691c19b8514a5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180516173738.tgz","fileCount":250,"unpackedSize":440087,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/GzpCRA9TVsSAnZWagAA0pgP/AqP6G4Dao9/EYEM8Jej\n2lZr1hHMSjJ/r+thiMQcBBT+1I36z0iWdi8YFomiDFVtA062gvnE8YL7fXoB\nSAO2Y+HqjEQnWcrgM44prrHIMRUwE7XWOuubFyaBcrxRot7PxWsIWXx5aemp\nsPB65xvb4jFhMdSpuTPeOyjQ60Z/brJl19XrXGPRpGcM3BjeT2EqOWcrnBOH\nJjqs9eHiNWnCJJnoJf0usLwKAOVkxsvvjF+7oMxw2lMXFQxQ6VodJBHd/fv8\n5i1ypKjuTwlUf5nXhCF6BE5iYRCPq8l6pmIGv1l1cy081pw4AouuiF5YRBfX\nZuKhMlqVExzLl2VWd+T1ZwyEMSTWy5nWQE+49ukEbOcl9v/HxkmW4/BOu6cY\nCOMQ0xxVwgXysBy2C7mwFlw4CV/GThPX/Mxsz2VkutrK4xw9MS1znYlfKxAw\nTw8rEaiN/NdFf5sxwJErR9R2zfwXkP5rSNkhmQWeAcNq1D5Q39XM9pskqfDc\n6VSauP08bHnfJhX1ieidHMuNAhQls8B8+1GRykhzc/uqiuAqDxjn8OHofUIO\nzX5X5bZGweVuj3M/fMEpa3bArRFa84Jvr3q5ZklM4VwtoToUj8yErZd1ET1T\nZMUPgSjXzJD1un0hkqC2nX8QBo6xjSTUoZupk5w6E8EySIkZ5ltGNUgBfW5o\nLUFw\r\n=QFCk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuUh5ZaK2EMfNbjsy5RYjhELjcgLiKMwf8/TWhDwx4igIgdm9H4Qa4zjOc2BcQAjRwO1ufQLBCeOWIXjZ0wfPX2uM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180516173738_1526492392757_0.8917963206615165"},"_hasShrinkwrap":false},"0.5.1-20180516190735":{"name":"@atomist/sample-sdm","version":"0.5.1-20180516190735","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"0f0eb8685f7cdc6b095ac4aec7c46268eee6bc13","_id":"@atomist/sample-sdm@0.5.1-20180516190735","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-uAXuvAidMu7sZ05hEB+ykKLzijtVCHJ1hTfLjX8GjRIs/+cGPabuwbuHswID5bL011fyPnJFhV6jgxjP1Y34cg==","shasum":"65b7bb965b0b2bb023c4e7ea89e771f51b086561","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180516190735.tgz","fileCount":250,"unpackedSize":440087,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/IIrCRA9TVsSAnZWagAAAkwQAIu4sDCzOxcb1q7OXIvw\nR6VbzGc1YqSezJYmYdQbLy+Rd0NoNNDN12t/OY8w2rOEaj5f4Sd6QEF53UFU\n/9u+rJz5eAVgzUdVR1aUo3NfekUeS6pMF1+3MHs0K0bpFgXavBG1hJ7n+L9j\ncRvDaXH97a9CQdA++iDbPL/2E91TRZa/K0zshYS+cQx+Grcs+8SOTifGijSB\nJl4lpUkiy+ifCGe+2z4XnMOyLzIll1gS6rcbPTND13QC2ihgZ/NlAJ/59ASy\npONpKpx/p82XeZeyYE4cNfJf8mn+Aphn4BBzt1+xhj+U5Edf1TZt4lZ7boXR\noMMj+fua/OvpfTAKoIY56Vbrl9UrYONAWlv/2q2txFnlAYlUsYQGiCaeoOBG\npvKd7zqzQ98QgGcORG81Gupf9puBYC3sfxuIMTL2EgC9WOlqTjNzSL+T+qNr\nYTmlEPWkbnypEnXGFucmKv2N5ygqxOlM4jWjlq4hdysJEyI5flFkBQ5rJ0ve\nkER6xdCMm4VHlS8QfPz+jW7xgkhyylskPn6gpCP+mQyBSzxFtksppXrazCFY\nKXviZ+4iOFCwjYL+Xfu/KQINmYl4g/QrmwF9/ZiTwWAsv64APc7y3+wIAXRS\nbFvLtZ0uOJqVntbO8zypNLVRm8Cq4nVcg9vyz1MY3GjxxxpsOXqjSwg2p82W\niZyA\r\n=GESg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDtAcPDVXryxk9CUvL1HMI7IlgWTVqzUtC0vNaWXe5OxgIhAI7114x5gbtj+AUBvqach0fVOO44b095DDMP0NPGfOL4"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180516190735_1526497834302_0.13138884480360602"},"_hasShrinkwrap":false},"0.5.1-20180517100747":{"name":"@atomist/sample-sdm","version":"0.5.1-20180517100747","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ed8566c0ea5001262b13aa74a68462cb92754d83","_id":"@atomist/sample-sdm@0.5.1-20180517100747","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Uw7gUTXjCFs9WcroeTFW1RxBwLrcCe3Hc7B2Gwb+L7lJ4VVjcLw2Wi7lEVSw90prKNn1A6n7BRmUpz1Exy1SOQ==","shasum":"a6e9b42a401d7f516537703223687559a9fd80bf","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180517100747.tgz","fileCount":253,"unpackedSize":445068,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/VUjCRA9TVsSAnZWagAAXaMP/0sVakDCukA+u9eLFsqf\nUZKM58ybNK4ZnvlAsae44yFZrQ6GkTuTXwJkd4/nnXJaKGiBLEgFfg/HtQq0\nLCIgFW73yrkRrPat8K9Txfa1653PKekxONu3QEzdBhVW3pRVFqIJGpZqKpaX\nasXV/Gp+nIB1icj98ScWqa5EAAevLihVesUyww+AiOyJz/5rcBqwgb+msI+6\nP9C6cY0Gc5SUx+GncRqJ7XblExXO0lgOiRsy0d+Y/qWWD5BI/G8b6wSiginc\nofA4s4nY7AxsvDlSrHEZS/4xSv9KLRcD/Lxxolm/iYl5HZilIFzmdvgGOS0B\n30O1LqlDi/tZpm9K7o2wcEBZVIWuOgf8/AuBi3/iDP/q23BE0iyrvYQ6WbHx\n/ZUm2IG8sZoAKa9vhQ5We0uloqCVtkVG1/BGSsLk/Wim4C2drTKfXo36HBLW\nw/7UcjFf98zCbm3hJlwRBeErIun5Vlc9zD9Y+vh2h6VACdnSRuy+QFLecJkl\nPjDYJZY50ibiiJ3ujyk3tEdORDHE+GLFR4Th5K7tmtbxxEOW0WOXV+lU7WSH\nxFmWX6xaODbLr3fBx4FTE4gbS+nQ8En872oD62h28YhFUs50mFpaqEU5sG9f\nNo+b1wQyPVkh4nUmY9BGsh2hbXfJzA7h+6pUJ/63LDIOAXqVJx4DMThcPgD7\nOQ8o\r\n=QSc1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDO6e3XuirkvJ7OULtad9RPk4sEQfzrsvJCC99IELuJMAIgEODcIg953lU9/ASl1KVpx5bMyqFfE06S3gFfjMqVGhc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180517100747_1526551842960_0.1396654901099259"},"_hasShrinkwrap":false},"0.5.1-20180517100903":{"name":"@atomist/sample-sdm","version":"0.5.1-20180517100903","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"dcef72501955670a4e3bc6352ce81b41cd6c8ac3","_id":"@atomist/sample-sdm@0.5.1-20180517100903","_npmVersion":"6.0.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-/W/Ob7DeeusMO+SHDzYhn4uHQg0zccAxCu+94yUv2m0EcJ95Xsogj9YRkiLAexa1PrxKXn2LXLud4UXrVX1UPQ==","shasum":"ca265bfe72f8d8420ee73fbb2d44a1a74a1f00a4","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180517100903.tgz","fileCount":253,"unpackedSize":445125,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/VV3CRA9TVsSAnZWagAAT1QP/12daXzjVpJdmQwr28KU\nrRnQcJAGK9NGSXhGy/+UbxzbFXNlOMViiBg0R3JesOgw7tjT3vbCuNFYWOUa\nFee/DTdSWTeG6RxB5Frm41DXC7RefyTefgGi7DIxI8jocCMutnNhLsYW8XXX\nNP1bBe0plM8fi46AC4Dkd9ZwVwYZ0LGlL2S+IATJNu6y2X309l/+xc6bV0FX\n/T5mP1kGRsZoTwJXjGxeWAohQUdoVp/XnNt02rhJumyOO8tLlmwyRgAKd4Ve\nNTFZlI4AI+YAQqrjA8hnY8QlR/XMxyiVtjXr3kUG6MdeKnjtWolZPBLBnpBf\n6bYyYEC8WIeKRBuezKD+aEXwVgFB4eyRnb4aKo1qu2D14q272Kf+QLNrwLFx\nfo8mUmy9m5salw0VmNs60vAsSLzvmSeZjyHoASf2Cxeozv3XJ0bPok7eLjE7\n8M7ZrO15jHNfHYKl3VL7MdJPg8qxRcuavenAFSLiV1UWLM3VXIu+ra0fhG97\nCFtFGOBZRBxiwKyhqAgM7vvM/jGSSpfs+wm7oCdnTi5xu1zBDu3oM8w2J8dc\nlHGR4PqR5GJ/BOO3ODI1kdyUy81/nLOsBuHXEgbwKzjDdl0c0lk5UKRO6B7p\n2bM6AJBz7hQyylD7kq7stF08XTn86JV33RGDEPLclP0V5jsc4XEb2Y74IRCE\n1TFm\r\n=ftZ3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAXropRA6yap2gDoYWazz9AzKXIBaqHFpPSzY7dlMbWXAiBQFEKHdMN4Q/+lDMsfcQ40mAat+cvEQQOEr5rnLmkrwQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180517100903_1526551926393_0.10677524980516173"},"_hasShrinkwrap":false},"0.5.1-20180521210543":{"name":"@atomist/sample-sdm","version":"0.5.1-20180521210543","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3ed1af92248a26274e92680180f86b29831f6d70","_id":"@atomist/sample-sdm@0.5.1-20180521210543","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-SKsEMno4EjZ7HhPFJRrcg1rXZIlk02NrmRVQVEabwM2hn+3gt6OLKJbfoFk+eO5QwBJS01mtxn1XclpzXc4AEw==","shasum":"9c3de0abc2ff806a02436342f58553d14dc9f26a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180521210543.tgz","fileCount":253,"unpackedSize":445164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbAzU7CRA9TVsSAnZWagAA22oP/2l4LYuLBKnCHnaAfr+o\ncKUhXs3zvhIO9+9lPz7BXrC9+GXGBLu1PEQMlMcunJd4SnRjNhcpJJSF/SZL\nJCzrTvhn9UHNWvunD4nU6RSbW1N+hjSPf4C4Y6GWhAK4Yy441k2XA1OWe37k\nQHYzef4Vufg6ayigiqICowFLVB2IJ7PKlGzh1+nT/9mZ06k/DFaaIWM6ez8z\nDBP7Rnp+k8R7EOJFvD8VC4dGX71iVEqRVTg1P7K0Z875Aw3w/NzewWZNy14j\nw57i/+bD84b2jKAHTkBsD8APu31znrIDZLPTPuiijJelmDNpcEPcVVGqmp6o\ny3rqs6+ucDkIm/juuX4I1N/xNGlpl0NXptX3BfU8spgtg5Hr/1OZjg+2taKj\ncyg4tzo89J65kLfguLJoeKv4ZSKNxBGy/3M+5sGCwc1aFd2K0/QsT4qC3v9J\n25DtMXq4EpBAQ6QgTKllcOpP/b7vmtgels/dmm8NZf6y3kh8MqDaSl8Fgidw\nIyhvCdoz6kLaVqIF7kiqTKKpB/jX9p8c9/uHPBrrb5axgF20AEdWn8AKil8j\ng4r9j+Hcj8RzEIb7WYAqBMeMRAu6TmYe8yHNz8JryH4sV7KkZ6HhnPyy5vvC\nxMD6ARs8QWQ46dHfVRU7E5wjskHnEMeqRS/NnBxMdPymueZQZHPRjMxgrxTR\nkxZ8\r\n=C0+e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCj23fAHqeepMdMuy8zZncGDaBC4kHBlnpJThT/oINgsgIhANJP7I7kUEbMHtLCe+VHP0IF7tr4jTEnNX+MI0hoSRhE"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180521210543_1526936889872_0.21472556857189296"},"_hasShrinkwrap":false},"0.5.1-20180521222807":{"name":"@atomist/sample-sdm","version":"0.5.1-20180521222807","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"20067e45deb6cf629b600e0a68f97bd3e4838cd1","_id":"@atomist/sample-sdm@0.5.1-20180521222807","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-yHRsALkGOptsC+6VGcmQhzEeosUxk+/ShW/xsXF1b1PJPwtwskMpJZBDWQ3/Q+XcDNsIa+axdXgU5HzXJOmx1g==","shasum":"02106f0fa74624f289ef343e139882683dc00d86","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180521222807.tgz","fileCount":259,"unpackedSize":447581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbA0jWCRA9TVsSAnZWagAA7JsP+gP/L7x/zM9OaZJ/h+tX\nzFnQqdk1y8Xec820NyRhGoWHUdcMPeYIS9DRki4mxQyQsUpj3AY57DBvlFGM\nNcklQQsfjRjjRrBCV1x5w7vdvVdME3vOsJaU+eY3p551ciLzsF3eVkVXh97Q\nlPGp+HyI/8tuJ/aAkZFpndBjCUOmjrhlIo87b+l7sCpEnJeK0eGgRfF+ZURQ\nbI9ILH/y1GVPaxQLokU0iGfls5rNs+gZUxMSkPTRw5Uod0rLdvRJ04L9IWXe\nJlEk2E1ut3bheKoqQnyaDWl7JjYYeFAJlz681xm4MTi0F7mJRt+qM/i6WzUD\nYtqHoSgHsP8bXebwjWyCyu8BzYNFhN6tulVd4eqqXmGUZnDeOIDkVGpEPYjG\nFJ7yyaDSsE0iFFScJ+voYiGR5/4FN/RInsgmoExR3EykEppIqK3/ZqzBT0d2\nGlaU0CVqerZAf2ZoDsAVooVTYU8DFCWyS5BQc8ie4B1szHoeD05aU0I/1qa2\nbOY1g5KcVr8Dlt1BSiR8wvnUUg09ZM07yPPX4sf462aX1h37na5xm6CEVwRy\n0vZpiWl/diOen6vD6JlSiJm01UQZw07SeFAPqVzBf1cCJcOrz81MtLEyn+MQ\nMme+f/dJVLcK4/nDtSi/82L2ijzI449cprjV+Mqd3LSZGbcyMSzxgDbsdY/r\nXaTr\r\n=tv9P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOAxH6O9focO6qEFFJMbPRkufuHtLciUU/Q1p6IO25+AIgRqL78Kj94QkGR+QOUsHtD5eqQmIMYlDFBVouMFL1wSA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180521222807_1526941909703_0.26695208597227804"},"_hasShrinkwrap":false},"0.5.1-simpler-create-machine.20180521224327":{"name":"@atomist/sample-sdm","version":"0.5.1-simpler-create-machine.20180521224327","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.16.0","@atomist/sdm":"^0.1.0","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/H17-l06zpM","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"433210bf514e4c0823e832f632efdba16f1b89f1","_id":"@atomist/sample-sdm@0.5.1-simpler-create-machine.20180521224327","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-eNk8IUGC+baE1KS4CW6q86dqT6Ymkq7cmYFZ1LkZ6coMiYzoE9uy10m8C8hLOMGtTOrYEocK7Vg5B/8D8IL1JA==","shasum":"b6c268ee2e6192f9d203394c6f8b1526e57536f6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-simpler-create-machine.20180521224327.tgz","fileCount":253,"unpackedSize":444945,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbA0wlCRA9TVsSAnZWagAA2W4P+wUj2siYYsuPuTJRyCYt\nDr9zAVUmUUS6H9DbNTJjWwMhY6vGubqm4xFlQLkYZKTULdsBoJXqBYXD++7i\n3cbHXYPK8bqF6Vsoc/J6ixH/Se7Yohso58coGXpS9SxpAszY3Wifo039Knka\ndW81wmGIYfyFIeazUauARJI/kpaSdirmftyb1ZxlJ1x6ZD2Z5teFhk5cOBDO\nbVzDy8liczlbqy5ryQrMSVUgi80maI3nGsbN6SLhkuGZJHIyrJzXl1mdUyUz\nZVRGB95JXFT5Qw6gqiOgxzlpONQ9wRP3c6J1ZeeTQQ+D6JkKrYQAwkuJdtE6\nYo9P8ud943+jM10EXydKJkUAi8ExtdP/akGMsptPMKPnbXfi45TapD9ZTXqH\nnj3XzI+N7lK05TBvHHBODnwtrgkIBVFgrGOGYCnHXTb2dtUxK3Sfap32Gbd4\n/jBRfeQqG6YwN4MUuudjZqtDhJgjgEhp/OWDcepqdbWLmeWYJlNXRGJ6my8z\nI/DxR+2n25+LWKLBjVG4oBDCYP/pKfRPHTvGmNAnDyzHCWH6ZJDdQMZW399P\nPl44J6LJYyCT0io1IaxrNhQl+Jf+dmPGppnhCmpUBLuSCfC2Ocq1Q85/th+I\nLZ/KYcRjy1VT7GaTeeR4JXP6KFktn0UtUIFeQ/lXv/R25JQN0io+5a6pneMH\nvH8V\r\n=/qcj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9zhfniQ+dy4AEjIz9pikd1vpzMcMiUSKNSe/DU8uttgIhAOsPt7lSbU3Pd5xZ6SOLnjEnOpoHH/6+0T9S4hQi1Bt7"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-simpler-create-machine.20180521224327_1526942755917_0.585476699964234"},"_hasShrinkwrap":false},"0.5.1-20180522032702":{"name":"@atomist/sample-sdm","version":"0.5.1-20180522032702","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/SkQgY5uxgyX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/SJVdb7-WJX","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ea5c2eb04cfac31d1d26e5f2ea99bced64cdaf07","_id":"@atomist/sample-sdm@0.5.1-20180522032702","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZUzce4WCoQpX9a8A7xyu4N6AeZG2IMt5VqMfyLKpBZFaUfMzAxhonwmN2LoazkBQKkPZrjiJS5sTSjTjfkTijg==","shasum":"f49a00322200213366a2c02c46e8b1ab909f62e4","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180522032702.tgz","fileCount":253,"unpackedSize":445410,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbA46lCRA9TVsSAnZWagAAU94P/RWL9pz9aczj/NldBPur\ns4z6zJeWBWWiLp5iCK6pG0c8eu80GOI+1GgAesGvmlRP4Dw3wzV0N2zQWxhU\nTgH/gPZ2VTOA64evYF1kee2yOZ5Fg6wOIbzsAyEjckY8WDQcfzTWejcUVavs\nc0eACda4I9YM7vCs5HjsCJDgzyJYO+OppKRLgAWidW/sj+gdTFcWQ/s3Kzcb\nC3LEHaY7XQI0ydPnugD35/kSfjKD7qk+1Z1YGUTmJznvEvq6h/yMP7nd83Ao\nweeYFB3zr02nv3UtQncqFPwFuiv8EIBJxW0XBeAuYmZHenDw0S5EXbklsD/r\n/TKhLC7oBkm5dpqnF0YKSk4Y3AUPAgSPJmODdLOWvst/lfeYwIq0tuJX0bvl\nRMjvbJz8K3ZJsMoodZ4v0H9E1LR+lh87V3tam7lgma5PWss61NdmCzV0vMIb\nMpjs9fdLLDc+yET/W8XVJKqRfvW9P+4AcMk3yTDEV5ARkDS9JXAbu3VYa87Z\ntAp6I21Qh4Z+1CeNV8pSP+47+/2jvPM5ZuQNdHzyXiv1NKoLcvo8Mm5K2o0d\nrm65BZ/xbFS1ueRI58SC3pnTUGA0pdx230lbjPB0J+IcczpVg08JOTWtL3hn\nL+616DU9Rlslkvx6K5zdpPHBnXqpDxC0SNpGCDa80aFMWcfv6TkgsfZzZAQg\nqSrN\r\n=MQsT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEfRS66UkCmf9/DXZHprPZjibCjIbD1nxTKSAfXcsgG8AiAD69JrPsDnegTun3+QQ2VNmygIX8Kz/SRHvmJzcKJXHg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180522032702_1526959780026_0.6737332178018238"},"_hasShrinkwrap":false},"0.5.1-update-deps.20180522073907":{"name":"@atomist/sample-sdm","version":"0.5.1-update-deps.20180522073907","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/HkLbKAfV-km","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/rkBiD0-b17","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"54bc5c738af65fb06e8fd2d6d6683f6139df1e0f","_id":"@atomist/sample-sdm@0.5.1-update-deps.20180522073907","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-RQlqvnwsTefeGIkcVRjxHSVzj3uxuzUWWaB/S03SZ6d2F41lw15KwUQ9iYwyuQwAV5OQvDE+94foUAC75Qkd3A==","shasum":"377fe39ce887912b919ba7515014bc089b2c8522","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-update-deps.20180522073907.tgz","fileCount":253,"unpackedSize":445422,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbA+hLCRA9TVsSAnZWagAA2VIP/2z9YLqUuj1HVDdLGqpm\nnedXDdyJGjF04bMmSBpfsXSovPjEwd3e5TtlRKwQ0I2kkKgyMryvY/uPlj6b\nR7j/OQmMShTfrTJUhC6RXUPNjJGWFGhpfKdC6++OaPbFiVv0Z5CahBx+BVdl\nq8c4sgkYsfcVX9WsDGtcLGb1jRLJuTXtzTNbDgaClalEIVtD8+qLYL7COgpB\n7xBqCw7vPQf3RaFq8+knEUmyiZD5jkmkNAcnm0dQYHv75IY36BC3RjOKV3ho\nzLuyU6e2kDFP8Ru/ptLwD+e0fjhGQie2+iM+8n9HzmftZ1I/VmGllR62+pUb\ni3SnExIiazDhzYdnWN9f0UQ99ne8RajcfyZkyXAxk27GQ7yIW2Qla1lIXtDs\ncNdd85fHWl+olpjDstxkOQ1WpYSMRM12o7blXdJt1TSZp/jgrxLusj5ad8Nc\naunktg1ku9o2LfqT/ypchMW2TPZpeawJnyjrtID8zwZsLRaMAec4Ps6dNjhI\nN10ui3oekpdn21PKMhC2GczuV4Sf6k7TGxi5OD5B1HXUICQy1Dy6AQOHx+48\naEwfwSsCPf71A2nE+JdTvdAuNgeBb3QbuIl64Tk3X9ueF7Mm/TKX7HhbA844\n1wYpa6nxUbGTuzLkKZcsxemMWeu+YEA/HLxXstzJVNut4pvJ9NeFUIDbxiRj\n87/D\r\n=H/ev\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIELK75vv672rJPQXUwSM06whAxRHN6iQO0GaSHLxkx5zAiEAgz36wQM/CRtIJp0t/I6pC5XFYhGb+eqJG1oIbfx0YwA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-update-deps.20180522073907_1526982730785_0.6782573277349635"},"_hasShrinkwrap":false},"0.5.1-20180523055241":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523055241","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b0078bee52789db72af8d8daf039b190d0368f64","_id":"@atomist/sample-sdm@0.5.1-20180523055241","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7cvcXSAEHvCwDsCg0BMElgowQ1VkBzQkJclBcg29Brx++7uxN6FWyT7V/0vPag2bOiTs9zqn7t2IOIEFq0TMjg==","shasum":"d24cdf3fa261fb175ab762117dac1b30c97d89c6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523055241.tgz","fileCount":253,"unpackedSize":445411,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBQJXCRA9TVsSAnZWagAApQ0P/0jBHIMCKFyxql7huqFD\nUl4seeSbCVVyx1UKBVteqRfLrEzso4KO1Z0XGDfckWsYm6xYPIjLyc5/pMWM\nmrXdjfKJ2ACQBqUyFmO58K9mF5xSzkINGz30gc9qgtDKIlKwaFWNhKY0aHj8\noXK4gx1uVoocqBYWj3868QHub2la/s5g8mm+p0wrwaNHovaWug675tn1DXB9\nz/r4NLDNFn6tSz2QZyOwyAJ906yj0IpXKpWqYal2++Od6OI9vaieTrUdpn0A\njP9omg/8i+2iimg/NAKLQ3XXPwJ+T3xQYI1QAapSRZuAKtpUDH66TzZtT2nr\n9yS2zNiV6Ex5N+pBBRtSojc4osFK/7Aw3TZLtOubK2q54vqduuii+fmvQknO\n4cxVjM8+jlCO7xRcLOZJsfUxeNbRExkbfq4+MQSIhxlHLBa/vaVf6PuwFynk\nikYbBvRJ+TQGQ60V2sfsmwDbjQ1jAmzsEh/CETl53s5GEE7o20KV+1DUsOiA\nTr1oKFuwvau7aUO4aNCqXt/xNSrILzIkIm0EjofxmjfU5bdq2rhnjiPmbGRj\nNdAa5QjKKNG2rijghXLUHn/prb2JM3X1k/YwO+lwZpK4WNgiH3n4w+35XB7C\nMgBS9/YTBAmkoLfeD2dZKp/fEJQlwbMjlVbSVP4OJFsfFBmGGvceS3yxeqAL\nBCDt\r\n=Iu+w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHhz00byqsKnk9Xy7TAB06byjTo+sm5lcCrog5cuSFouAiEAtWL44fueh2BNYruxK3gd857BMwFyTpnZhPQXNdVyZyQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523055241_1527054933905_0.5177737541544614"},"_hasShrinkwrap":false},"0.5.1-simpler-create-machine.20180523060512":{"name":"@atomist/sample-sdm","version":"0.5.1-simpler-create-machine.20180523060512","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"25763763e4fadb01dc72f3926177cff1a0c74e81","_id":"@atomist/sample-sdm@0.5.1-simpler-create-machine.20180523060512","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-MstlpiKtPe6dX4NcNkttXBkiWmD+jD2OhLICCh/tiUuKYRQH4vHhNWMo4AZxC14hjELXZlboCWETcOsQrQXOPg==","shasum":"66149fef3a378662908c52df8c08d069859e1710","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-simpler-create-machine.20180523060512.tgz","fileCount":253,"unpackedSize":445522,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBQVMCRA9TVsSAnZWagAAxBUP/11Vpq4bESjCmu+SXUO3\nbkhTL9azsT244Tec1vUYjzKkdUXUsmDxUbKThk5VS5jXRjmnJG/0GQ18zfvF\njDdHayZH0rixlEm98JQw1Iv6taDuLE9beRIO6ksCOrqSljD9SxihILCzTso5\nJYkrBe9Hz91X18Q23KjM9ukbZSozQwAyIiqo0Y08KmGV0KxGwr8T8s2h86zZ\n6HnWTEcm1MQIR1nqCHICFqYx2GWCzk7rx+0NmayrcOCX+v9lcQvBl6TkNKdF\nHDit0rHkD1Yp/X3yYADWDELOXDrZDrZCHOttOXgUOw51tWDdD6puuztBZd0h\nbvkjkugKHdNVhrW39rrDucMFWljspKv9M8QunqRY0uTcjXJeb5Qg3RxNorK9\nXhP/qazyat8FRzuU6zACOYLdwuyYKo0qv1vKOHJY0BOGj/TgFNMA9tt54SJm\nULSOx9dBUk3M7KlB8DWZdo1CEuDFccz5Ux5u+GfFcHdyp7Xg4p+FDRYl2Oy2\n1INfxVNHfb/mTKdNdCR8Kyj4jGD/oHE+BK3tZbuwtwfw4Zl8/NpRIZECnwO0\n/CV5rUSS8EXvLpVIblkP0JNKBcqOZzgLTIg1Tq7xYhmD30LrH8cdnTW2I3BG\nXdkIO3rM4vZujoOfQ4mcHI6V1ul6loG9pAf/1gvAgjnaYWij6+yMrE06QBMY\nqyzz\r\n=uP7b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICohh+fP4XEQSbhpqwuSKQuAJVlnXOBtx8DbDVBNOrYuAiB3w4R1qYXSIObHggXa+/TCCrcLVFQB1zaZjcIqNL4iUw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-simpler-create-machine.20180523060512_1527055691552_0.47380726357122516"},"_hasShrinkwrap":false},"0.5.1-20180523060927":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523060927","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"af90b732818966cd108976e8a9fa01241f9f70da","_id":"@atomist/sample-sdm@0.5.1-20180523060927","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-pJ6XjpyKNKj/BPybWMJPCJy76AXxi4OOGrTro+SkjijXGRd16hqrUwnLm/Ukl6xVPz2auxttObND4bQmyLaM8g==","shasum":"11969778f4dd9cf557736af33d9711102106d66d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523060927.tgz","fileCount":253,"unpackedSize":445499,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBQZMCRA9TVsSAnZWagAAOW4QAJ++y0TaLzZKeR5BToPG\nJl0R1hIBvNl55R8Of4jGbZ3HYPg3WwA1ms2JwbkFFb0Rd8ckBmQRNFPBgsHF\nNLQYwCdRXD5T+7Sdmca6oDDlZMsFQL74VeBor2LxAm4IcxMyFa18RP8hmAmA\nPsOscIFBTX0nPrzTWzcl5co+4UBvcTDXbbK1l5Flm/vi8qyqmMaNYuYziNsb\nNoPiErQ04umplecADVvd8M0VZxFM/l+8vosTKPL9/NgklKaVy7vyNrx2vSxB\nNWfV3MWbiWRtozqdw0uHU+qPl1++qQ5r07CCAo6yCt6eyF5MAp2LMIejJ6P0\nnphdKuYzHNrj7+1iVK62p5fIU4mRMwGJU7MDFdJJCzVa+Bk3kjurTKO9l1zJ\nV5S928tUZSZ3JpEo+QFEcvXWcnNOrw1JsWH2cdOTSKOk8N1/bl20PmnxTrOC\nixyTBf9yeHnNunX2lunGJaMc5Sle++Lf2AZ98rJxPkRUABmQxvNv7rBMafHy\nAfG78suBnC3M8LOMofkS7DzP9RE+IQtqYBly0aIvgol7IGJWsktzYDyueAmb\nQLuZc94ykKv8kx/71tTKTnohf7QKWpCxAgZ9cRZriYMWbpozSwC6su7qIFj0\nPhZnxdkxhfGz89bSCEXkZISqMzAMIh8KHKbmi1i3LNuAUgWG1j8y6CQqvbW1\nLdry\r\n=2tdp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAW4PI+wjiZppOQW/oREy95baHnwsTj8LWQxWU5DsBLWAiEAlTJc4dnBb8L2BC/WrayFwyo6UaBMsPaqYSDhnZSkii0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523060927_1527055947356_0.9462643152784092"},"_hasShrinkwrap":false},"0.5.1-20180523064648":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523064648","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"dc785f262bc10f3a207140286303433435cca8ed","_id":"@atomist/sample-sdm@0.5.1-20180523064648","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-NadecJGnWBcpUEtNV71SRtcWBHCcFYS7HfsQn1vTsCW7FehxdccCypY4ZJw7Hc71dG3lvfKpWRPf2G/Qbu98ZQ==","shasum":"5e21cb894dd1446174c5c20622d3bc09555dd50b","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523064648.tgz","fileCount":256,"unpackedSize":456170,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBQ8ICRA9TVsSAnZWagAA9U8P/3tC+A9c764b9NcKhQdX\ntv+tUgEff4H0RGtDAAEqdL38yaI/R3UefW8gtfMFTXVHBIXVAptVERqI2OJP\n9nKtyRKUp0DOsdh2uFrtRd8/2t8iv6k8zFQck2PqhpJeCWBhRUMF8Tgqrx1m\nsbivay7OVmPzezFCL38IPi4fOnVv7NIlkk2VxgzLnkdctVwQMGwP0AXyceIn\nTWHSbXTJm9Dbh5bAOuv4YdtXNYtqUEgcwzPiody22VZ+t1dC6ZJ1VsOWu8O7\nncs3SqTuQfoAT01dNd5mrhiBmkER34L0+edhTUVDn5vGwWTCDMAHjVBpk3uY\nL5xiIusjNE/83iNFLskNO8qOj0W5EbQ7Zd54Vg9mKvSPEYJKebfuj2U16rDx\nWp4tBTTj/+UOnwQ/a6bOlE0A8YQB0js9vDeuRD2SAlGjvcYjUXd/RmrU3sW/\nBbbYlnPJlwmCGu8khTyAnGLmtgjmSVhvsJvUscDJaQEJi2pZLvgpkzev3XMF\nq9LYgKVi+ajd2bzieyczqwLLtRRsUA8Vd01vTWsuLGkeVUbqs7aCEfNxJVnT\nW6nsIKH6Uk7lh3iy8iBnaaOnW7JPH20HVARGxSMQ33FfrVX1tN/GzWFZPXMv\nEHtpH5ivQFy3dIgkDyBFQORluDWExMVDbVZqANc7UVqzjGr2xyFhhqlRA8Jk\n1oWQ\r\n=30os\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8BZMTFvyPlECEgsJMDCAwepgIxlZFvxoBXGBuWen/pwIhAJ9Rf4rduiC3cQHZnWElELYFc/PNxf/bVdxMzBkxLicn"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523064648_1527058183926_0.3518110033090882"},"_hasShrinkwrap":false},"0.5.1-20180523070430":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523070430","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"cf48b80e0b64704958a55b5a856f62dd9cbf9120","_id":"@atomist/sample-sdm@0.5.1-20180523070430","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-CsmEdR7Md8wEtiXmq5GHYVb4K8P5riYY41tGofirxF9HB6kdXuU+qnXaNIX0IuF3FO08kkGmjaTnwg4NwUotqA==","shasum":"cc51b6af7a8a2b94601b57747ad2da20774ad3b4","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523070430.tgz","fileCount":256,"unpackedSize":456617,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBRMtCRA9TVsSAnZWagAAq1YQAIpoHNyK2/gdfU8FJCI0\nRoz5iUWeakXwaFPxHAIHs9bZ5HSUGL027xoyvEl6tOUgkZA4kAQiLv/FqF9w\nq0aP8PPO/ZSpDhCzzkJ8ZNGWWK2mi5Se3Bxto390XiqmCW7F6MxjH+KCQLK+\n0GyszjXdSrznXNUrM+4t5HyyunRdMhxN9w4woa8h2tt0fqlVG24ZhkDnabxd\n+NamDZbAVab3Bg9+EPCU/ux8pZuQwQl+mO5nXqr/Y1gtxAEPmIMi0DqH/Utc\nn8kmpeC2phvXOg2MK5ScyeKgtCoWgK1e2TWf4nRUX984lHZtXiAcqa3ORwgm\nYee1PfWsVqZa7Ftixee25HDxUN+8dE6trsC6RyhIoiz2PO71eVYNpS0+iEtw\nhL66lWT4ru4XTxd4sfD0C7m6+Xii6UmbE1OS/MuZVykZlrqBi6lultrvGLy0\n4FXue4Wv/okcQ52mkdXFtjDtY8nnJ/U4/0+jkTrFKO6pbqN5g9ysym1xlnKQ\nL4fPdg396zHaaZmvJXxrXopwPkfhRzIAcr/iPQiEuHD2BQoSf6Trm/KUVQ6I\nNOY3vjoVmlZuelsPw1fc5saXln5M+B158bvyjMr6zXLrL324AgRiLm8Yhlev\nEqImPjHh2wWLahNS8h0C5RA/637sU/tW2cK1LyWd5D+FmdVfGUzEsnmTLHHy\nF+4E\r\n=gr8A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBLTZI+Nxm3WGrtttMnRM56k9oSikifzN2y6DGj59aQ7AiB7NY6O6mBkh58jsLczFwKsqX6V8VJmbBqTW/SL2EBmNw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523070430_1527059245135_0.698359730720534"},"_hasShrinkwrap":false},"0.5.1-20180523071213":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523071213","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1f120d7a0c78a4ce9adf3d100b76f813e531d0f8","_id":"@atomist/sample-sdm@0.5.1-20180523071213","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ELrlgwFSUHIgmpfSuDQtoR2caY80VF3q10XewOEifsRcCDCzKANr9nEnXEAiU65mMy8MDp/fOXoJi7Y3k0Gnpw==","shasum":"b45333f3a8b3b7d7e413fb15d561f7c58a6c6aca","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523071213.tgz","fileCount":256,"unpackedSize":456872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBRT7CRA9TVsSAnZWagAAmuQP/2bvUd2uujz0wdNU6Pjf\nUeXbqASlnbBsqY6zzN3bfMApnlch1f7wIHaqSWu8+N7bdWIqqmBoINaoHCKH\nZiHTpkVpG1LqYpSWqAjHRRKCEc1lxI81D6YjCgvBapQqeoLTs7svxoqEcYb2\n7eJOgcsc1zi64YVkCBNZ+AIHTGfTzRv/gicx8eILeAsXJSjRMhTllxkeckc7\n8qW5BleraZNcdPcAPx4hkdViWmxZFJvPITXyDlbkZWnDIWaqkKjbxlWJgKT6\ntEIe7QRQOV7DpDQ9LEAhkk72JAJP4vMNwouOGQ1JFhGJDW2IbvtiBBXFCbLH\nS6ILG62u2Ys+o1UJ6ostbFzf2VEgWVXXlGZEMqgi9wP9xc7kFvWNvHb0Hfwo\nTiQ7iKjU7vvpH4Sd17wec55bEodg59HEBVoHDNHcJRzlTXZrXipvSNTf4HjH\nIKDeOziLFlpUsjrsam60DDaIz2ADWOnScI4edauR4Gh89Jd8/HQfxWaASfd0\nR+IJjOmjJZ4NKYiJS/+XVkjlCBfSp/IHHhoYuXxKcRvAVgJugLVAL8+lYbUa\npYY8ve5frWZJCs07ZinFgGbU9Pibwy6bDoJjRluXr/Kkf6G7bqtKE6kvWLDN\nm7SNN9u274RG3urn2ulqfMIw70QsyjXZlqgu9gx/snG9KHXp4eV2fVmafi2F\ngCzS\r\n=8VT7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICFnOuBs1gY/hmbsZ45DLxErzjPD8+kGkhNXa3zEHeBXAiB6PCVlWE9yFs3HncBGQvCriHX+mZUA5fYtkUqRDUnGSg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523071213_1527059706419_0.4449199529072607"},"_hasShrinkwrap":false},"0.5.1-20180523093626":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523093626","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f4ea69e8efe20f7064bd60348ff76acee390356a","_id":"@atomist/sample-sdm@0.5.1-20180523093626","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-sk3TxXif3tCusF38e9ZReoU15DTZh98BHJwVarjg4bu0geOexYWmqJ6vQLzhrAc4RUkFpPAJ1YOSYiiLwvLhMg==","shasum":"5c6c43de318898b9927cfc41696a12b84444c5ab","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523093626.tgz","fileCount":256,"unpackedSize":457188,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBTbbCRA9TVsSAnZWagAAb4EP/iKlUZm2aIOcDeWWCmod\n5LOdxlD4mZ/QfY0hVMzowCECVga6OPP1jEqeVqztFP/PzTfnwachAwdQuRjD\n++LwvtlSevyn3aTcCkoUgtJOfy9WVuJT4vqgTC15OPh5jaN7CTlzXEz3IlRR\nD696KgjPbqH8qhWLKdIfTiddS97bKc+bY2xPOUiEhh0MjV7vhwbgjQLEOKMq\n9j758/2zVqm4orZ5+xci9jUN3yx/c7Mj8WCFF5Z6iseQdc2SSk0oQTkMpwgh\npApRkfifu8PmHbBl3GEbwKetq9ULs/BLTIT1hKn0IiKecH5xAcY1vE++VRlk\nWM6tZKBTUgkPMLVhpZQSyQJ7WQnaUl6b1CTjbdnJGWFasLmPDVuk7+rxH5S7\nWV5LVBcIanYgbc6t74e+Bw5hPl9R9LtTZglkKUDnu1aGH/ohacYSB2Uinhe9\nbML8wH/wosCRJKAVs8uaNZwhCbgQ3KgEiH+J35DBjVWKxjsnjEg8KXK/J2qw\nrNx/kmwkupuaQ5CHYDzAkHNN0fIJVXiDBvLBqYt+pC6fyf53l6/zcS5i3xb/\n4Sno2tl0+na7e+PVaismV6/dqblLkiokJJjWBfqiWe/F+qSh8eEyeRiLJriU\nBaWzpwlPN2p0PKqsZOAmdWLr93FD5DFN6r45kynvV1tq4xQmZUVff6pPFF14\nO6hO\r\n=tejW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAy3vzijoDjgdoCA8bndEdhHO0Pgc4JCTtOVcrcF2rbjAiA5K/BPgV5s9zQeild12f/Ncoq1ys2VblfH9XU3KXK9yA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523093626_1527068376519_0.9483026000281265"},"_hasShrinkwrap":false},"0.5.1-20180523102836":{"name":"@atomist/sample-sdm","version":"0.5.1-20180523102836","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryU-vJ1DZ1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6251de5d6b1a34eef1a0b29dcb6554647929c349","_id":"@atomist/sample-sdm@0.5.1-20180523102836","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-9pZr86ab+Q0ViJrdpmXP1lUaUDM9fdZhsaVLMW8Q7he21ZDYW4WJBNtNN5EFMNvTnYuyLy1MqFcgCkDM0geuAg==","shasum":"41f98c987fd7603c5705637664c89edb695cd86c","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180523102836.tgz","fileCount":256,"unpackedSize":454157,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBUMFCRA9TVsSAnZWagAAqfMP/0HbCOZR+vrY0T4lwXOm\nk9M2+V/SnRXDo5mq1D5/9BUoK+wZbiQ6+fHdIp578ysUr1z8tEogn8KS6JFa\n5z/zMDIgiZ/LM0XpRS6NPaVnToFf3uU0Nkx7eh1e9pasXmwSah7KDn3qqxo4\nTVQFENWrXmVF109ezoHIZlenU7sNl0lvUA5v7R4vxjt+WMJwxJFp+Yma4bOJ\n1aNfp3ggwCBz0pEFEhg1mKRsRfJtDlUT5P8CXwv6CKdxKYLRWcrfQz2OWLB6\nnc2JYF0o/H5Mb1UCoNcKnigOnASSJzq8pE4yH42i+XfUAxrigAGFynir4H2M\n+W/KrfmA0N1Y41deZdowfamJiUrLk+cxBOL+rFh5o0Ox4Agp9GmAtphBkjlC\nQYv24WuI7J7dE+iMggwdC80ncCwVhVGOefGToy+GMWkiYgdkj59pdZ7iBllV\n/Cxc+j0gO61LqWBKm4naOe0DF3guRBcO0gDCcwvhsQbzPIyjzm26mdiS7ttK\n59BViCEhoOuxIjPmTHdrgbx1zwWqiorU5LYvzA+lXdLU82nxI+WjYvUWYDZL\nyyKJMwnhlwcC7IG/3MmoFnYz9FAzbXB4xTX7MhROA3LMEeMcVErGo/958Nta\nO96WvzFdQMzk4L30sMOMYroLwuHeEPnqgYGyS/aQcGcdXl7w9h9inaRwJS0O\nyuDK\r\n=PYfS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCsmEyXwMo8WA3VdmzYYlX536YlsM8jEgfSSVuKV9J8QgIgQ4Uk+rj3DctFuD/hAORfBQCVN3YDBfFHX/pa4RcxKxs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180523102836_1527071492995_0.6274800093642046"},"_hasShrinkwrap":false},"0.5.1-20180524084900":{"name":"@atomist/sample-sdm","version":"0.5.1-20180524084900","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/ryIgRHtl4yX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"4ac496b2bd98f3ef9f1722d66073140d3beb41e8","_id":"@atomist/sample-sdm@0.5.1-20180524084900","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Hc161Pm4KimKej+T4K7o5Gg+s88RIfTAnYgxX/W1PKxV0NNl1Q0vypr1c1xqlaYSOSuc0hGdrLlNdZrn5nwJUg==","shasum":"a82382eeff958845eda7b1173d1452caed7c266d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180524084900.tgz","fileCount":256,"unpackedSize":454162,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBn01CRA9TVsSAnZWagAAcMsQAIu3lqrngwaZpswymf3V\nzZ6zyJap/h2yBwbReumYJZVJF7H/LykZZpMqaBEQuAjMqeUJlXyntuRyrq7k\nEr+kjNCiz8ekpMWWhXEomtqgzxYMeiCM5Rdmdw460CD65uj9Pj1ODgur2Xyn\n9TP/H1DPJZbUXmFFC80PI428K/Rlu1s24B3noU8ZtvEzLK9JgMgjiO1rdZ3N\njF/TL6hLH8LZs6ZpnYWBz5XPrlZOW6Iau02/jXUDdlcpwQwkD7XOm+yNQP4Q\nStXLKfDsCy6QpwA7Dmw278LnznDbsGJ3T7oOohU3bdcAZXeKcx74Yxso92kC\noDDs9zYEbKiQ+sUxrLeBWXuyMIM0eOQKg6K9e3gUDc8PKs6AJVvZ3Hk9VjqJ\n+Cx3DUmreVLj1Ao2MIFp45AtBDtbSJY4WjCmwSZB14PLrZjJ5jrOZ7lVfePE\nghemzxpsIWp9EXgj92TQ9ptaoHqX1NnhhBS5nGuIVJ/B4XpNr9UheqZivSJb\nxbJNBsnH2Ee7g1qGb9aWwMEJ5pDPsgWczYD6SFmUY2/t2PLtU3bFE3xLlgE7\nlYaeEz0/ZdA/ifmUQdY63cqMGGmfKRxkjDMBvv43Gt00MbNxpdBp8+fEoYwk\nyPWpJGHUiQ63w0KJGwIoQf0oCOGGDsyzYsFEWenilmu3KVKUStMqGMfa/Y0I\nMGWL\r\n=AuUU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFLYJiSF/O5EwBXEKtfUI2WlOJu8c5hgHsna1L1H92iuAiABzEAyrxFNxLOJ2Lb6QqPay/rh9AvFo2Vu1VEd9sop/g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180524084900_1527151924363_0.051437976578035505"},"_hasShrinkwrap":false},"0.5.1-githubStatus.20180525042137":{"name":"@atomist/sample-sdm","version":"0.5.1-githubStatus.20180525042137","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"0.1.1-20180525014606","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"694a36dc43a22e127c9b5298aa20d6732c6ace96","_id":"@atomist/sample-sdm@0.5.1-githubStatus.20180525042137","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Lc6Il+H02lutvPNVDyGa+O9sR48I0+TVZMGZ93De0gmXliyxo4n4i5zJDGEdA+73X3qbfKClO58nYVwYirm4vQ==","shasum":"7e7a9f6b20643683e21d0c9329078890b6e33bce","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-githubStatus.20180525042137.tgz","fileCount":256,"unpackedSize":454240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbB4/9CRA9TVsSAnZWagAAl48P/02yoTvRLWUvAZDTqWh+\nG0DyHvgmwF366CqONSkwABhaL6QawHOIE2F8iOv5TGmicprk1ZRIdiP3SuAR\nXV05cpHrCGQRu7a8qlp89V57X1mrq2IWRHz1yRIm8PUO3wA016fqfP/skygo\nvReY8YKpUswlYWtYlQZ2LVWeXNA1oBFr/9N53jGqCIBKnLldNjexe4MkHv0L\nhEN0lZu/g1byuDbROlbopeFtPkE7bIk817vVC/gOg9ee173/yaZceL0a4kMR\nWoYn3d5B4qOrNd16uuUeyiwrBrTicH7hYqC2IkH++ZOFV9aVdAs6prp1p3Vk\n4mn90VjFZPKZxepmv5mUUzFxWCy1vvuzl9Ec2idRscf2iiKLudGqAqUrmzMN\n2MxUUISm70N9SkEm/Y/qXNYcD6LJOW+9tqoimWbHP+8sm6V6P9hX5VBZC1a0\n24SPTQVDDWIox27Osqxr5U3muggAS/fYjrJRM4ZHHP0Pq4e1wGOL4RYEj6Q+\nVUO57qdQQ8wdt7TCD1+JYK/D7JdUq9YWF/p89JBYmWNTHHtUUSwmy/WZK/te\n8vqyFc9PN1pZNNXDvs3Wp+3n+Er44glUI6BjqWT1Ruyec5oCZxSiPC51ESzT\ny22BaMpePmnqLFOKKu+vAdfEDlVyMW+pH0xpMCrjgrAqLgFymJPY5zHO5pkV\n16C+\r\n=9k1g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDbtfWUPjMUIFYfQfL+gmxrnjvQdkSSS4BSNuGqKoZ5MAiAosgHzOBkrQkcW80nrDDWtN+mEiNxzTaLz+9Hd6q4/kA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-githubStatus.20180525042137_1527222268612_0.5764023150545341"},"_hasShrinkwrap":false},"0.5.1-20180525050336":{"name":"@atomist/sample-sdm","version":"0.5.1-20180525050336","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"0.1.1-20180525014606","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"38de8f3e9f9575feddcc564d2dc9ac4d5e801968","_id":"@atomist/sample-sdm@0.5.1-20180525050336","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-zr7YW7A7nBQ5nUK7QqmPAn32hMZmt68GvGgzRB2JsLNkYYCaSnsFgS8IAligJJ0nYlgugTaNHYbDcm5peJEmrA==","shasum":"fe737c84743f6705218900f022a4a0775efc6ac3","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180525050336.tgz","fileCount":256,"unpackedSize":454227,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbB5nSCRA9TVsSAnZWagAA/zsP/1BsMYfFHiJyb29I8hfd\nGxUnwahsohFbcbx2Zo+51JH9kwTmBXK9r2+R4zbcaP8EAIiuUi8PhqK13kUg\nYMCXkQ/8tgoCN1rjE2sIbJLEw4C3aOohNzqh8+VHx5kUFFoiQWn0CmSZ06xa\nPs2R99a1Z8dHv5+5hRA1v30gfmhKFmUqR425t+LWmNhaBL+6mmmlcXruLuAs\njdk95XkjUXXtWbVCH5EbbFXUX8kjIGkFO4O8MCWlmy8b82mhePM47VRursNx\nJl1h+f+fbtBOfhwfaAVblaOS38U+/oM9jAypcxaTLWntWiBubwsKJZxcAdeu\n7amY2m+UJrz5nZ4/owRyUZ3R7j+K+A4jycdKuz9IBfv+QWXXqgZnRjLZgzBU\nk6KyAklIxOuPpJCwMO8cXUI+tP/ulbvL6Ia542PfzJEhEF+nYQHcMQLR5JBz\nMBtqMa01AB2NyFiV/64wtDy6LR2TQsQOoal0iOpbEqZUR8bebV2z45AViS+2\nEKtLCVp59r5KGcXF58k+c06TRN5InPC4EQboG1QtGGFeEtQUqL58VzC+Y9rk\n9uZ27zjKrCpHRpULpg15Ej6BeIF5BcD6iocs71qH2wZulQWiq83Pa0wRbaaX\nVOkzo0M6ikMhCAXIS/yanxZ6R0jGKLEeNZ3sv2QYLW4V0B5kL0e2O0qjX7Jp\n1e3b\r\n=6MKb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFOoy44MqOTjfsuylmGxPubiGcYPhQTGiLhbj+cv3GDDAiEA4sjuSTIvXuPkyMRCth8YlUlM+5xYvgMG6+HbUxMT4Io="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180525050336_1527224785222_0.06130512645107844"},"_hasShrinkwrap":false},"0.5.1-pack.20180525125817":{"name":"@atomist/sample-sdm","version":"0.5.1-pack.20180525125817","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/HkUWxpBKS17","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"97394e96aeea8eb6e96d624965d258bd6136ed5f","_id":"@atomist/sample-sdm@0.5.1-pack.20180525125817","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-dVwocCa2OcdR3N3eG4pvpyuF5GCvnxrYEkeJEv94SUx3IJIhXsmEe58b91Ga4yxA2Gw6+eLkHh8FtCVU/hV89w==","shasum":"f15cc7da9a8b193827648a70d490c1f4ea845bd9","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-pack.20180525125817.tgz","fileCount":256,"unpackedSize":457806,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCAk5CRA9TVsSAnZWagAA5uMP/AkdXNX6cS0NyumI9PcA\nHnRoFurevmgkRdq2hEtVtm5UtAhNUmmYVP9BQdGErJ6eBnEW82d5+9Zf4FKR\nxnfk99rWokd90SDW73i19zdL2JmMnqmZvwAndM3XqKMdSjsnPrZtrplOmeqe\nbevu2nF5YwA+TAFwRTYr9WckbUWhYN2pEt+pXxuMcrSRZKMDynXCrapgaDuJ\n8ohUFAbtOb+CZFgzqEUhLI8We7ZTwuyokyjOu/KmqxUVYZ834kT47TFHMP9h\nf/bvQQG46jUDQqJkmosMSNvM5IbGQWz76d63MBy/kWCO9t7gY68DbYJwj3Wv\nu77Qlp2Dcrq7O7DXMvz/XDFeR5H4hdSOAO9/B7UUyfgw7cP6bjy6IAM8WIBP\nNNfFCjD7vFEhsqOhf1ZyWnJVkkkO4oE57rT32uPqSR/ZSey7S1X5+Sd6hhZf\nPdshT4+rftw8+UAhReo3+dBoZa38CwTD1qWaoEVqxk3qDUh6PPCuVFT1K26N\neMqag1+5+WWEFdsI+VsOo8Hyogo4fvvuk3CTYsWumC+Nfho/4bVMG3nyw/7G\nTqPrgwgI4+CV9DGhMlpwr9uxhOzdV2yYuH41To4lNPJb/Dv5P6n5O+eFsnUH\n2rnWGnljgQDAeXalWani+qeKtI2RA80E6g5AJ7fYxTWdHWwXRPjmOOpTx3Rt\nmNkd\r\n=gevm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBzI2l5cPNL4Ntoi9pM0hmfsYRvQSKCQYRSK8LKm8d6vAiEAgSdqzRxPLJfSm4AWHwkJJEXuL4o5mrIiL8FYV7kv7qs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-pack.20180525125817_1527253303943_0.5148502594611395"},"_hasShrinkwrap":false},"0.5.1-20180526090115":{"name":"@atomist/sample-sdm","version":"0.5.1-20180526090115","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/SJcZBsacLJQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b69573d1a8b0b3f5fce2022c1779a9240cbdae40","_id":"@atomist/sample-sdm@0.5.1-20180526090115","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-s4mIBI1iwA8+bN42vffj2/g2J7xnETxJcXcPU1X6Ikw+x9okggIUW3UoOoMLzVQ7gAeerAcbNh6ekpGgXqGNGQ==","shasum":"d758aceb28ef6c488faffaba72930894e4c435fe","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180526090115.tgz","fileCount":256,"unpackedSize":457733,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCSMoCRA9TVsSAnZWagAAR08P/ie4w5EuoWGAsUfJaBS3\njmdl0DxgHClyEj5ttczuTY0cP+9RJ1Ji4euTXV7IdOy1hhAD/t/MsDMnVuG1\ndeTjpTf8HlDRrqh5qfbFye9Q0mP/sZax+COg95tlqYQi4d5H3A6HRFOkltWI\n6kuSa0+12kuaWA6b7OlKTNA80xtlX3juufTU4h3egc4jje5iIa9ZmdffHO/E\nkbjoyEw0nIlVU3nEsB4NYArh9QCANu8yRm+f/G9QtF6K8gnB7YOmB1ilWMPr\n+1XhrjSxASNuw3KAdTXq62qzRIlDx6NrNUno29HiC3i8LNpsiFdoXE0hqyUQ\nw//7aH1RXHNtZ6Pw/sTvKmASlNNAyqmZkIcEkoibDPgE+GaF+2I3rG6GJ3TB\npzQJvCmX8R54nt4c5CjA7PBBEYbuEhdw2GtJ+z0SwgP39yW7d4OZoI1DEXPw\n/OQKC7jNzMSKI11jdcxrKheGgThOxRXqksUrpnyDPUvF7gdVVyBt9wIZzVNm\n3q9+rQhQsZzjPE27rTLri6pNDyNMhr3eVqUWztEYh9kZNmYyfp9MKRlF21f3\n+Sua+Li42+rYQqwXDu8TBMRTEtSuPiV+5nTNfq+vneyHYVD6K74w6sNa7W9h\nI6dHO9WjOxIOivAecf26gVrB3fso1IplWEUTKn41CgisSqHfcplkC+hUSTtM\nDbtA\r\n=AG6S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICZFNNDW3K1hJHoznYlxvAPmUzR/VResO88SID6gCtJTAiEA+yCjhDoQJWyFyty3ULmx5+w2ts4kX3hEWdWw3Pkmjbw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180526090115_1527325479259_0.35358708226122637"},"_hasShrinkwrap":false},"0.5.1-frozen.20180527040406":{"name":"@atomist/sample-sdm","version":"0.5.1-frozen.20180527040406","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BkUrXAsiwym","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"fef926cd24131f50d250bd55f74374a731ad3da9","_id":"@atomist/sample-sdm@0.5.1-frozen.20180527040406","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-kJF+Z99ntt0utITUwGUNRQfLpv/4TDVMQa7lTzA/d9SavFhytIEKHxOPuiLWZ3cd03yoqv7/4swZ+qH+btRPqg==","shasum":"9d52486e622bceec6b49ec4f0e1e6d1e571d0698","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-frozen.20180527040406.tgz","fileCount":259,"unpackedSize":461873,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCi7FCRA9TVsSAnZWagAAmyUQAIHQ9yeFYaQUyp9W8JF2\naMrCPJ2LT0aaYPKPIcWnwkrBvftmaHbUABAIg8YZLncuvra+iXwBLLGpA5tI\nsLVZjU9x0XBAtOyR3QlULHlZMPJ1Dh+XB4Y02xzhMxlpEk489+ofBINiONwk\nlsxqMNN0Ktr0ztw/rnRnXWgaUKiqJ/Cd8Ow3P2AmDcjNshf/7hiB8Lwjfq1w\n3sD9Tp7bfeyqG6uxqfSGZBOFhbbTCl7nQ9ZgQ+VXYO7DbeO9LcTWBGdgSvYo\nsskVrTZmp7RAhfFVdpNg5Ce4dAcW6hxC5xEVdMxkYj76cWRPoGKJZW5FL0/I\n3lkZMkbH5EiIt/r01nhBpsRcL54MOE3bjj/IB86QEPF7DjfuWKWKEOQOdyyn\nsdcNiG6x/u3tZOpWl4VeMeyv/vGNuQ+NeJhDOIbCgfGXlF5eFV6n3w/G1Zu2\nCt/ZxKBphp56dSLbmS1C/2mL5s2thdxlgmHXsC1uN0pQocS7wUM78evHFChx\nRpsFyEl6pAaqiVzorYcBTKrk8+Tv5WbnvnRuGVtDE9S+KDCtVAzZe5VOWjPr\nn91XKaL88kBsxutucU26NEo90vVtZ6TdNUkTtq6yxP+A3pZIsrpcl+8Bm6i2\n56IYfevM05J05sMOJt9vAefW1si30uEDayNTPyvJASx7shg0CXFAzyhxg+qH\nsqbS\r\n=qTWV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCH2PJVrY6Dt4gYtN/Ddlt/PPvPYsq0bW7VNPrlekI+YwCIDyvY159rJZjOEFdm5AdFPKDIYjOaswPEWyg7Z5wvVql"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-frozen.20180527040406_1527393988434_0.12813082676915877"},"_hasShrinkwrap":false},"0.5.1-frozen.20180527051839":{"name":"@atomist/sample-sdm","version":"0.5.1-frozen.20180527051839","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BkUrXAsiwym","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d572d53f7580fd04389565e33562c1b294768de0","_id":"@atomist/sample-sdm@0.5.1-frozen.20180527051839","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lE0TvJKA7EOJ5hG/hBQcy1AfgRurwWfZnuCOq0a7IGkI7L7kIBEwDhlfqBrUfAhDbXmR5CQKmaIOgAFzx1RVRQ==","shasum":"9761659b4cf298e6b28520d90e1927cb2e635cdd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-frozen.20180527051839.tgz","fileCount":262,"unpackedSize":465312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCkBRCRA9TVsSAnZWagAAahMP/AvgCR5BwMxlCnMyoreR\n2hEF56FK0kQwH9qTMK0Dn0OOIoutHz50xJAaIlm9kM/1n0x4ClsvmGuuhEDb\n7xshwOfqmpqSVF9U9TtL10S4NUYEggY55BEMZDuumzF3M8Yu5VW8f6mSbhpE\ncsyl9ERxutdlF2zjGGNDsOpxz1CIzPv8FS3AwMIeXRkWG67EZme+p7R+zbWX\nFg13sY3W8iVjxdN7OctG/6+YwSiMCvOLfrmc5B4HdGdFplOuPIdjz/1KFIbL\n125dSS4YuSYS52vSYEP8DqIC+ZrN+0g4/LYWzi28MDenvnBamb3eILCL24SG\nNO2VlNyCPJYEHss4t9pPcwEENaAAfaU6UzwnGHRNfrFFOl8DDARN7Gzm+Rhd\nixW4kGi3SEW2rXQ/oavIvz+Wn9m1C7xO4SOYXQHxWuTpBwNaMCmSLnWApvfT\nfVUc8Dq5w8oUIDA2oFwQTy7dCDXwR1zrBPqhnItl6NtWjSxvkxhF/8U18q/H\n2sw7ADX0xw30rvB+y5OC0zQD13/iZmP5M/xTrPW22adFNvTLVtrUaMJQHxo8\ntd0jB6ecuU2kp7JRSU2go3t7prXy9ca6qvg9Sk23GXrvmPFiOMCqLcmHm+WF\nnFaJjmdRgJPmmjzGLd1X8Pfph509K8pzdc4ylQPCV6SMmC3vd9+2Vxxj7EXe\ngVz7\r\n=tAhl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHt2m4eclitSpS0Y/t/jD0iXkKWGaaD5NcrUezd2GdIVAiApQjgdGvfZslUVlur03vdD2zW2PDL/9ZzWX5hmFdGQ2A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-frozen.20180527051839_1527398480863_0.05658693292362127"},"_hasShrinkwrap":false},"0.5.1-20180527051931":{"name":"@atomist/sample-sdm","version":"0.5.1-20180527051931","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BkUrXAsiwym","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"43039f143c1783e55b68629caaa016c2a41869b9","_id":"@atomist/sample-sdm@0.5.1-20180527051931","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-1HofERSbwg7wpsrQqhutBLAVYRsLu9Md+UMn5L7vaL3MxV9coSYmzYVna5iS7wIHZjHol2BpxIWr18EksK78Ag==","shasum":"158c943f15e34b544bcb1f905b1c2a5067f21b23","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180527051931.tgz","fileCount":262,"unpackedSize":465305,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCkCmCRA9TVsSAnZWagAAQlcQAJXjF7mZ7fY0+y49gtfn\n+WZ2HkfWneTMlfAukjGcyb6RvMOcrzZ/weA3dtO4V6ZJ4B6D4mPRdum2yx25\nS+h2cj60GkRfRb1nWP5Gz0hS3KGC4HjKCRPciKKW7u94KTvfuV2401CF9QC4\ndfQem33hyVUTHMeoA7RvxkdOcSOH++HTKJoeGQRD+YYQ6Aipb8vDkcK+/pK0\n2/hqcWx0w9g2mPCVITM21Wg0dRvcdYSsV8WGWcgj0FCwaK6+KopcbwttZDUs\n0oOeCglS1MqxTQgdGEuR/IsQ6db7qEBpLlvlg9NPjJWY17Wgmoo8AeQ23qZ2\nd7jC8rX/oGNUeIe+cNhM5eido3hwnL91NjTS/nyTZQRSl+hCEUH49QFT0Pz4\ntZOddTR3NDMb90jsLhB2uxr5rqtotDiBNvRJDAsMppEBLfMcuaN6S3V/WH6R\nCdQUZ7WvgpnFwOFeIRv9pUvmI/YbW568zlJDgDzYA7jkTzs+dYgtO0elTOX0\nsSQSJktj+sQG089ryp+ESlpk4JJ017Rw4zWlCb5BruTELh5VCewomVrjE96r\nkh0m/tFnfxQ5pkES0HE4NOQ0lOVFa5b3vyaJWEw7lE2KLcNm4SQRezAepapb\nKFSpVHtgPKPkwfhlJOPRKvniAqaQAXfaZD6OwmZqk7ZIriMJLRzu4mDJDX4u\nQpVh\r\n=UkjG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDxyTXSQfLvRX0xRP5V9ZuUznOJy7HbMeABJwOzYpfg0AiAHIZVErEH7XA8rvYnqVprYkkumaxlRfruz7BwTpUMJGw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180527051931_1527398565947_0.6081952012895437"},"_hasShrinkwrap":false},"0.5.1-20180527083332":{"name":"@atomist/sample-sdm","version":"0.5.1-20180527083332","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/Hk8Z3XiJdJm","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ba6fe205af081c6008177ec0eb277d3bb60135f3","_id":"@atomist/sample-sdm@0.5.1-20180527083332","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lRn2VNi1zJDrLx/axQoXS2v+lkMdP+XvMvcDirtIMHiOppKiDyep3uYXWnR2l3rxqInyjBsGvdkppmKvJ3P16Q==","shasum":"dba675591701d9c2e2f31ac3d7c4edbb357026c6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180527083332.tgz","fileCount":259,"unpackedSize":459860,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCm4OCRA9TVsSAnZWagAA0xwQAJv8nN5OO5klanC4CA9z\nLo7rjbwYkl4UboT6Sjv63Xa6HuTB/LNHl8wbaHC27hoRMGouy7ZizDUj+IGC\nJzO6Fyd8Ssrq/HmMn4r0/Kv2S06UipdqZfg3rQME0jf25eANIqbvPtcWV+uF\ni77vWYJqBUilowSEdd6GAZejZ40+BlfR4rRohvt7kTWIyYFNNqNYjgb7Y4/q\nasH4nkjt1OHvSm+2TlsWzrfMFE6DzPbaoVRBI8lS5cKx8hF2dBwaz5LRj+Ga\nCALRZoV3uZ0X3C+SQOYEVbX+84KjR5gUmYLhL/tSgyZvwvvu7t8EWTzWg1wa\nPfrfLJOuBFTUNfgilRsLOQijgD4hdYA4qNYXtNa0eZxJVOZKFHj3FGmYZkRc\nCAFMRIRrZ11R4QIse2Yxvyjs5heg1Rfdd9v9KkxfBuOYGpp+KZqe6kNrd0P3\nDf52ybdzQTIZPFy+UYW7y08tNd7GomlnCMw1i289Wh02dydxELk06KIckoYO\ngbuWswB9D11R44GKb2WafXFQx123vJLOdeM+ivoNsdYAjS0rwWFyTwK/EyNU\nZisOByF8KkOGj6CpKS5G5n5eCFsa7DkuRq4H3a2ygsuARc7Qp6TddZ+for6A\naqFwNyy8OO8theHvHfZaRYJlTC+wNx8zSWBr8Q+OGf6+ryg0syZWnH9aAKxw\n8FID\r\n=hII6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDAV1l5Lo8wAtaJSgA/dh+b80bjIoKrk2svN9EQpZtxpwIhAK2gd0chH3WP8SjkYkzA9GQr9NZkG4WhzU4loH0ibOJ7"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180527083332_1527410188798_0.27930784178794776"},"_hasShrinkwrap":false},"0.5.1-20180527105503":{"name":"@atomist/sample-sdm","version":"0.5.1-20180527105503","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/Hy8-Q5egd1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/S1E-JulqWJQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"a5c4f89bd56d2517b36fdbbf95bdcab0ee533c0d","_id":"@atomist/sample-sdm@0.5.1-20180527105503","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-//ZfY2N+oNkvKswueOvv8ani0EmEW6EW5pcw27i9+lmnhGz/1XDsxcJjeQYhvwLDhk5cIaeb67ol4NDyNzLjxw==","shasum":"101acd7de3a471525dcec74ae1a4ffdf1052ea75","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180527105503.tgz","fileCount":253,"unpackedSize":453123,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCo8WCRA9TVsSAnZWagAAMYUQAIYKHI0xl/frY3JMHZTv\nYpnKsPUJ+Df02rnlQRVxrhcbSVRs5vY9f136xmfoCiH+WIQ92sCOWvWqAUWO\naNmOm2v1o1zIHPATgdxnroLhJIHJ8znqk5FPCQZVq0DG2L9cuLnPeQKkW0z9\njTQ8IUZoBH8bhgLw/Pe/XyNWgOCYRo9R4rjX16w8JkZMz2BQtwv7jKfAjYoq\neMSn0aiu4WFNQWtQuTd2BOe8eWaxJ9uxWSVV6SUbUh8+90n/uanMTyvv+GQA\np5UCZVc9h5mDyEAZPQQrxcZJpQme0Lxbc7F5RCXlmUxWoBHPut2gNrzD+Jnj\n7AwtkT9v5WpYU9Tqb/Tz2jvZnJnlFkX0aqTg3WPDhzgnIfv08xAgEdmB26Pw\njxUr1PqABD4J/6OG3E9u+iUGXr0m0qMXOdAyOH4Q5Kro3auaCwbOdKMS8S2S\ng78lD0pX9UauU3w6itjRnZeOPZq0Pefc8p7kgch7VVbvBaVZky9ttlsCN+9v\nuxA7kSY2jaCbTYlMmRTzKzomYe04u89gUVL5hg4iF44piWfT4ZKv2//mtRA3\nDZ5qWg6yF4GHVKOzWgnfO58d+zb8c9GnaUJnhJikJR08nXE47OdyvokOVtt8\n8MyZp36VWzSi+2hllzV6Kr5fPJbsmBLtS/FSl7LH3D20JAoxzP5HyqsdJWOU\n5FQZ\r\n=kN8e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFusGuQK4pzbPL6oIPHBR9WEanEnZSZb2UbdwHDxk7+wAiBM7MGZ9PKb+x0yXWXWxMbVEct5fZ8Mgf9iAY/sQe6nEw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180527105503_1527418645662_0.052708568780018394"},"_hasShrinkwrap":false},"0.5.1-20180528040559":{"name":"@atomist/sample-sdm","version":"0.5.1-20180528040559","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BkIW-QAgFy7","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"434d90a21bc1f09568b7bdef5a8e02b06a923e3d","_id":"@atomist/sample-sdm@0.5.1-20180528040559","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-JR9+jp37ZHXZHADhKQ8wXkoYdHw6NCRyBup3Qau0mRuREf1hgeJmsgkidUO8Lq193OLkY9Qy1hoYbK2qOsvhyw==","shasum":"9dc973b31216540e1b853c9f82c0b64801ff2c92","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180528040559.tgz","fileCount":253,"unpackedSize":452370,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbC4C3CRA9TVsSAnZWagAAnfcQAIFvBTa3hZIhHBLS0nqy\nW6zsjXGf8iL0+CAoG5dB6usJVsjzp4wEbbWz97+6hr3l9Ap6b7oxBEaL2sFE\nOoa5W9sDcdp5f4xWjKZEGJeQ/PrxZG+0As1bu7mnB7hQ7CF3d30PhSoDT5FR\nLp2KJJwN50hz7jxdIX/ZoMZNhsiJqZ+RZTBL42vI4uLZaHhJmplsJOXNpVMc\nUm6yQNRtU1SqJ7nVhyz+4ATfwkNOYf/pPtIbO6RtRznZDr8hod7IgCgZc6hm\nX5qeNcPeYEG6U2wzhb9hpMJsrKIwWtM3MEJ4LWcveG2zNcfPWNNRTpYPFw54\nC5whjxaHfyzhFAFITrGuucktqA4M52S1mUrIzClpyb5e/19PSzxPYWuhSlEA\nGGePFIkUAHJrJkRqhv7BN/2bHMcFJF8Ck+vEjCliu2eeg286xEVeTL0+PqoY\nqCdWdbGVujfec0KX1xeAWhp1bLnQB2xHyl6VgUbipb9MoTJD7YiPk2gVGFdP\n8S7xVa9c02eH+t5DlbG++2wGCskrfhjj0wAkar6dX/qRkti5Wf4pxIw2BD11\nPYEbO/83z9YHg8VShSHVQo+uChm0RcKQ42nG2gVYOWcJSlXmqaRVH7/rrNMm\n8bVm/TkA+N6f48A3IU7YIfA4nOQ2Xc4VGIqR8v36wWBBAZzPMzIleEqi/8B0\n/t/l\r\n=Nwsj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBxjcCXmeCJ/1L/xXZAp7MQ8F1AlEpStAhTpVh6O7oPtAiAbNhEPTEZGdwOMSlU5m1prjFlkRloJlpdh5jOrZWRECg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180528040559_1527480502041_0.3213841027147277"},"_hasShrinkwrap":false},"0.5.1-20180529045647":{"name":"@atomist/sample-sdm","version":"0.5.1-20180529045647","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/HyH-pwDI5JQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f82e0146501a3ad2d20cdf550ce628790975475e","_id":"@atomist/sample-sdm@0.5.1-20180529045647","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-wYYHM2/zl9QB8l7bEAOZRkwaNeNLvWs7kFsjldPAXBBdtsUrP1WKIo8FkioFeTG5NCg4Mbyb+v2ZAN/KBmP5jQ==","shasum":"4a9517bb84320421fb35bc018387f5af18c34d5a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180529045647.tgz","fileCount":259,"unpackedSize":454759,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDN45CRA9TVsSAnZWagAA3ioP/jEFTSi8Q5VVQXYsc0fO\nV+AwazLwkYJck79fGi6Z3PNfeKRLcn/XUqai4gSxnvEVWicEPzfIi/Z5TAGh\nozfaE3MJaMdv8aS6pYMga1bQEHRN0zXkJF2GghXjp7Svaawoe7NVE8eYk+/2\nJlRNz3/FWVTj8zKBLDxFJbHAjHII2rDcXipwj+l/zDMftgU4Cw0uRaOvfPlP\nArnhmgUczX3gPbhaWUV146zwtpYDa2optT0pPGjJUNGcRstgelYoGia/Ta+N\nbR86XKZeOVFW7yx/eKy99QGmBIVapybONJWEiQuPtJeO3xPFUUYkL32vQGoB\nrCObTVZ4GY3EArLn6sGyJvlPXaN1y/HSgoHPmml19Kr8ISQpbGMn0CIPRf7+\nMJUfXa6ggLRk9Ys/F2BsGwI2ZFCGqOqhxk1F2dL6f67dbMy66DKmCdw3AeXX\nId1aeJIxW9yj/hcYArYuSa/Iqtay7gOosud7zuUCKtayHXL+4awTcRQD6inY\ngRD5DycqjMaa2c5q7PqHLQ4WpmnQdi3yoNF8QPKTse0K8XXYYi/vPZcwkHfo\nO7MAOvkGpfkAU6h5jAFbV7jwJOfyUPOpvOWEHQduNB3rF9Rh8V52/E4FEonb\nFMXyvGVQSEDEYSs8WB4GSdbQNZ9/kbD1QIWJEz0Edh0u7zpfLkBSMuMi0sT5\n969h\r\n=mpeX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID9aNWPha6QUyARmVIAqZ4xdcviZ4Rhtv77jukVh/x6WAiEA84aDmZDTIm0dHAdbYeg9RDRhuNcqQERZCGNXMKzTnqk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180529045647_1527569976026_0.8349034420591444"},"_hasShrinkwrap":false},"0.5.1-20180529051130":{"name":"@atomist/sample-sdm","version":"0.5.1-20180529051130","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/HyH-pwDI5JQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1c235e0ee6e3e2d9df6ae42386c58a6e67aa4321","_id":"@atomist/sample-sdm@0.5.1-20180529051130","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-yC0zi/l7CYfaMCApnOf1GHwoHj/TSz0ag8M0awUJIqgdFuOYUEYscooVpiKFGPq5GXYhrIptXqlQtFwDoaDz2A==","shasum":"144026651cadcbcc21371ca6b8757fd8637a97ae","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180529051130.tgz","fileCount":262,"unpackedSize":455257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDOHBCRA9TVsSAnZWagAARuYP/2LHikR9qYy2X+9EU+pg\n29mZI9LIn3N5ILPBQn9ML4gfwb7iB4byXY5Wa9y9Ty3zhrUH5dESROb0tnRp\nYZ5oF7l7pNrfjAg+cgJ4Tu81uu89enECuASCpX8Kw/KszyT+QkBPtEa+7K1h\nBmoDtED3Cm9PJeEUqon23dfZAhj9RTQenS0Dd6Qn0Mr8wPF5+Hwg2NOBMKQ8\n5N+QnB3VazL4fD0wW8QivzgWDsgCMTHU6JzbKn/e9xt3adUhlP35ntrrsrm1\nensZDdMfa+0kop/0JhVt04GKVqHFbBrVcx2T55AzMfUajsdfoyZ8d3rU56Xp\nxZl5uRNZl/asLXPUuFdMfEuTRd4+cnmsrlUvoIoTGaJT84lcMne4Y0O6ckSL\nChYKf0AKKF5rKwsMEbk+a5A9MAKKLaj/rHIimDMdH5FGL8DN8jxxcQA+GbL4\nUHbFj8aY0BDgtLVtHu4RqyfDJA131mbgp9MT1WTZ/wYj6ulrkd+fshtVY1vQ\nTiXV9zV0lyeFRnp6R2jn5JhYtgX1Wpofb2fMe2oQjBsMa3tnwFTMuAU6bQlc\nkmg/tw2bvCBdPLKwlFI2md5sZtAKW+u3I7b4B++NX+PnAQfsrDotwfNfXRnj\nv1w4BGOQFE5ce0TTdopFrhi8TcBbFD/RpD57JNesrJBvHNn+Ra7bdeYj0Z60\nlzLF\r\n=kqeA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFUhBJip1vZMnZFLF3rQctvkWYe2YtrSYOoaeoe4IqSAAiAWIP3qCsgIMAs0v8HzTmRcSCpl6MTjnxnOyc0WizUQEQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180529051130_1527570881224_0.4630375130676254"},"_hasShrinkwrap":false},"0.5.1-api.20180529103541":{"name":"@atomist/sample-sdm","version":"0.5.1-api.20180529103541","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/HyFx4lus9ym","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"85a3b250b71122bc65f4dab89269e007bb4ea125","_id":"@atomist/sample-sdm@0.5.1-api.20180529103541","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-y3Hf10mgiIu1Rkc5B1kCjau82EldFheSmKi3j4mI6LZF+gIGVtj9cz1i8tx5kWC7r3S32VJu6Pz2kSpUU/VQhA==","shasum":"27ea1d1221f48c94d7c0a4c6f969a5398ed99273","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-api.20180529103541.tgz","fileCount":262,"unpackedSize":456967,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDS2RCRA9TVsSAnZWagAAhQEP/1ds9FQDp9TaNfMSzjQY\nBhujKKut4wVxGw1LE02WQAM1QBHECXzI8Cv7Df1cmkJ9JmHVGi0HL6VLYgLs\n5kWPvYemYww0MF3chmiWwivmc1iZtmg+h+whKS2oubNrnbiaTajm4B/ngzm7\nGybJ7a4pNWo5ZOopqdJ5QQBCmUBJXoNCU1Bol62ysBNvz5rFum31321uEqdz\niyWb7phtxsHvE3dEbT8wBnsJvkjUemwlZVOiSs8IIKF5hmIowHlFPl60qXeJ\nEn9OvT4qEgXNjKwa/xkmT8B7f4XzSYEyQXnmAmxMyb9J/4eI3lqCH3z9Qrq6\ntXHrbFNlqJFeE+7zIZvwdmgJdEdhFnE6NveOWCYwTnR1ZRMS1DXkGQwrFy11\nMnwA1kh+wr3Q48ijqOYCMa6c8flYtu2ew3V5EBbbOxMd2XUmRCjzG/ghuuFz\nGaW8ZeJ8ZgrQ4Jk9jZJIevgfm3JPepN5k3r4dwdWpdtjl1IcK3ehsbR33qU3\njAqt7m4LCnfBAguFCvfiN2bUgG2N2YY5h3jh3Z0hRMupO4YrrOyzlogEf5ra\nDSBAQWC0tPlup9VxYtiemRomij/SI8kdcHBSzSK8TgktaguOJxhMQ6FOG8EQ\nqUXRwoTH3NLsWisD5EH5XeUittMM1WYo+EoT/r13FJre3MpBIMCZPVsTBHe7\nlEgX\r\n=eYhn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOJze4/lB17XdsCJwxBNith0vC5TYgob85bwKICRan8wIhAIlYlY5EgzxMw35OWEhLvXswFli+5HanLAOwT8Jjpu/t"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-api.20180529103541_1527590289225_0.5338003360664201"},"_hasShrinkwrap":false},"0.5.1-api.20180529123728":{"name":"@atomist/sample-sdm","version":"0.5.1-api.20180529123728","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJUlIHuT9yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"56807082e3d5256b1f64b08ec12f1e7f49616a7c","_id":"@atomist/sample-sdm@0.5.1-api.20180529123728","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rZEC+apvLnBTwY/bUdx8nlVdmb2MPl3j5FS9RU2jCrUt96JXBUb5EETwJ3RoVoPIPhALz+I+m25I4VwqCLIjug==","shasum":"9a98a1b7c2fe229854ccec9ccd89885227d9ac58","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-api.20180529123728.tgz","fileCount":262,"unpackedSize":456904,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDUogCRA9TVsSAnZWagAANEEP/18dl79nCWR5YRl2YQmP\nBQ0vxePU6jZKd/ZUGRdxr0UdN22dpAA3PBT8ZQOSYux+Q3VqjQjaIbIvBcRn\nxad3OabUT9ygoKg+VZjAQCyzOnF77hqCdLa41ObTDh/Bv/4QMbmFNa81W8Bi\n4RaZ9rK0XFdIJhye6OKHnlKVQt2THii285YtaNQiRrslLMpJpwBlR0sUGGQC\nAdzZLKQjw55EcYkqmAJzBPc9uQbN1y+IkT9O0u6ykJSBrBfv3Ni97wfIUbvn\nRw/8Dap2MiNG3whoH42BxVXnS7KEvBIG2kbG8dswvHR+sMY4sZaPAptrYblN\naxG7RdXJmImMa5UO41ywX6hcqBe2U7LTqWBbxx7zBxtEZoR6e4oUqCl6gzj/\nxNCbXcKbOJrfGMCwna27sE4dqDc6NQ8OBWDMWSyoyJjGUz/Ak7pqVP/BwOXZ\nSmPVgDIXR4sFVfu8FTGpr3k6FwZMuaGhVlQjbXA7RehDhD+76ReUEykM7f3M\ngt1Y4eYMdIHmQJXmXiCEka+x94GgqQ1xYP7Xd3IGsu0uI91W2Cdra62kVku6\naNZjyneCJESdqa6NONaOc4aD2VKoacSVJUUUmDIzViMXYQAN7HWlZldPlx4J\nMpHOYuLV32W/lhil9FIxwlQZ4SezoBcUJ8/OISQz0VB/tfdIkZHHIseZ6TaS\nEyzl\r\n=BPl3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEqW9PgYyCdtQ2/FXu4jKfzMOsu8iavLzHzCB5m3XvsIAiBpP579f+TrgnnMCWIAI4YoUH7AF2kOM3tIylGuXjgtJA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-api.20180529123728_1527597599189_0.6089856132901916"},"_hasShrinkwrap":false},"0.5.1-20180529223704":{"name":"@atomist/sample-sdm","version":"0.5.1-20180529223704","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJUlIHuT9yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7eade73dd5c42dd3ae33606d045cb478346904ef","_id":"@atomist/sample-sdm@0.5.1-20180529223704","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-BpEOY/4s8tEeaTRolvnbO7oFkpDxo40KkI83rT7xmqpOPir2KaM9hOsGZlDc0dRYw+A2iKxuOtCbMbW7Ph8DbA==","shasum":"1869e22b779cc4d59c24503f8a2bbe8ca1ab90ef","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180529223704.tgz","fileCount":262,"unpackedSize":456900,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDdayCRA9TVsSAnZWagAAXaYQAI/jmByumPf7NBEM97o3\neFBEuEkLJkLx0NQd+kfiTk24xAvGQXrB73Ylw/d8Bl0TcDtXWEkgQV++lVeL\nmSO/eqQMnR5wShWEL1JbqsHL2xofOuTzHpJftVnhB5iza533V1Lnep4DfU+n\nKXH8ysdb42ECwL8IDtC3wDhMy+wmlDddpGRxYuquWuR0MwxtR0M6MtZKPyFq\n8+QgL+dku+7DL1QJSywmnVU3pMfkPFirMqPpbltoosj5lvb+aTLgdx5OVThO\n08Fj4y5bHe9aT08KJCpFDUPQJtWQRfKO5I1x9VNpoVrFprbUjxgqyX68/Z7H\nvDZfNqiMm3WXMuRW/Va1CwBMpNpuDJ/MzNiOLEzxhg9ILJzqCtIBuY9mPab1\n00dN43jHi3igFURmAdUR1aB+PiQFhdgUOjOc8Nnrdc5f3f7sarcuWq+ubIvp\nyibmGrrRD+sGRut+qvq+gSKMTAmwQyK4D617JLDFyFx7Hx3kqCeEU4IqlNXO\nOllNv5oFSfZ9Y5mn5mrcQpfbDp3BFqo4c80Txidgi2aZAxZOpXb2jqP6ae8U\nDCieqxGrGE74r4GCeRAtMHlLYth4H0WhtL9qbjtyLyQcPtdqtXpPhWT3a6Ze\naWKk3Ze09v3RJ/ybWXa/bu3v5stGHNJR/W7FJFPEb22m9P2VM1I6VBoELFGE\npLvP\r\n=BuWC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXJ6AvBXOWcum4DwXCBnByHHb9qSRZeTpUSU+ZUI85vgIgNZMU96V/N25DMqnoDV9X4eN06GgCjs1mQM7g3zlBKoo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180529223704_1527633585084_0.9373668049454142"},"_hasShrinkwrap":false},"0.5.1-20180530040100":{"name":"@atomist/sample-sdm","version":"0.5.1-20180530040100","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJUlIHuT9yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"4bc4366be0f0f5d43c9378569c453d13016a9834","_id":"@atomist/sample-sdm@0.5.1-20180530040100","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-vbDKEQgnqQWuGZNS9r5vNhZkKqLD36bn5p2vsDO0IfatIDHOm4pHhyOaBtYhpbRnM+al6QskM6K1MzRB2YMcrA==","shasum":"7b4c8fec8a8753ab7a9cd9605b971af26a9d4b81","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180530040100.tgz","fileCount":262,"unpackedSize":458692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDiKYCRA9TVsSAnZWagAAj2kP/3v72ebMEHPtXXZAtryC\neBsdxwuyZaaN2nUc15TAeulUi5XWJLaEu3HxRd7OXC1kWxWiuz5r4XC7tgDu\nTdboRY3YKCNewvHhMHg57K6+yvae/0y48nefhGjB62QwMwsHYYGhc/YmaTUm\n4mTvvDpmma1fuiNsHhd5t1rtZ02hIhsJSuTlxWQJMWrezPjYRkCkd59GQsD/\n9yOqLRsTaLguaXjjTVtOwxTdhYvZ2vH+O+AwCEOwfOmGlC2BWfcK1Ofnl2iC\n6OONJMsvkZAj9URsVdlNCkjV/jcEd1TYzKNoKBvMl5YNi1bcecmTwlKkVS0Z\nptsgP/Q7nZ8qESTDbia0c86wCOLe2DWHYDit2PQRFJVfg+xLD/DpS2Qk/Tcf\n2dwsqKN96Eq8IP+RXhMOkumliwvooUx6ga/amvTghNwh3FE84vQjFBxGZ+aQ\n8ogpDHjRddUci35fnYop8p2fjZu97s/WnIAuI6Obl8IOfFPUJM7YS8NRSzY2\njHdm+vwcqNZKfnDOiGln9HuoiXuVPh0+pqo6+rNsWe0b1upOpo7IHx917oeP\nzEd8wB5tR4tM2HXa3jnRqafAvcR7ZAdhl2qKFzrUaT2L3YmZ6TPWVGd91B9g\nzCJicx+7BzhXcXaTm/lbz9XC8ZEFEK1I+zbg/s4bNr6cxYjqt9B7QsGSZM1v\nXw37\r\n=oxYR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD5gArouGmH6g9v1M9vaSG0PyqlZRjAdBqGz6XhLmuFaAIhAJVTCVK3eaRDsFNnpS98R9deJJ6SLohEPhc6PabwpmaG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180530040100_1527653015440_0.7315583473581473"},"_hasShrinkwrap":false},"0.5.1-fixNodeBuildSmokeTest2.20180530040929":{"name":"@atomist/sample-sdm","version":"0.5.1-fixNodeBuildSmokeTest2.20180530040929","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJUlIHuT9yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ccb26beb9a1508f31910caa69aa056a1ebfbd661","_id":"@atomist/sample-sdm@0.5.1-fixNodeBuildSmokeTest2.20180530040929","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-UConKMcmCnCQSXtcI9XZfCE1w8eEiQ8CMkBpH9/BlIIESUBNiB7SekY+TzRnFCK+eutFNp4XPEfMAMy37L3GWA==","shasum":"f9052a31a0d4124191f0a7af768199b08b76680d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-fixNodeBuildSmokeTest2.20180530040929.tgz","fileCount":262,"unpackedSize":461163,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDiSaCRA9TVsSAnZWagAAgYYQAIhGKCPMt8OI52J2lJ3P\n6GlXvnED1l3pfbVT05JkhjFdOrfdWIi8whIKZKojjZEKr4zSbQxjYp4EkwMm\n4oTtZ4z9PBO6RfGHf8WI1Vl3ulpEo5y8QlPHDZ6rL9pY5u3m6GVIaKs6F4G/\nPkq1fAKCBjF4BH+RssFftpmnElj3m3b0JwVVEAqODE08y0BHV941FSVZrWtn\nNokL+WLBbS/Az9wWg0irGGceK6+3Nn7/aj+7nu4OQVLkdAGgZ8a6W88c5D52\nvIJJO8AQMHgO3aSNmNW66+4U6ZscIQQTAvTriUTeuCf7yA42VDtjtu+MTZQZ\nHmBr+ImTxLESvG8C3EWuiXcBQT+tUG8S2qCh0F2TfhN426zVWVbPrJIlXnzx\nlORfvytgAF+fpCFbz+gldl/omuqFijU++mqxJ0tB5jLbvqhrj/O8CK1+Giu1\ne2E1sfvOnR0jmiEGm38/AlzydSQ/ui/AH/Zau8T//rwa4KbVYtmJi4Tg3ENp\ntOUHzJlB2qf+U9epZOBtKVhh8njQBfGOx8t1LwEzsQT95RduWLgFLlx32a5J\nMZ9ncalYG65wnkt7jYnwaw46sqb6VCfOVtBSbbZxtkDsxxc22lAcWeXMZnqz\nFenvqHP9Olrfz1Bnt1wK2+5ky315ESTxNG1z7rQ1dlU9SE2Q4TJCW0tSpMvQ\n2vZD\r\n=6w9u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCe7y7FgkmY1MwMtFRFssHSmH921yjfHssAIamlsqfanwIgNob4X6rhwHmWiQjyvs1esY8ZcJ42RaKFBSm2RqUZ4BM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-fixNodeBuildSmokeTest2.20180530040929_1527653529574_0.4061023720466248"},"_hasShrinkwrap":false},"0.5.1-20180530041549":{"name":"@atomist/sample-sdm","version":"0.5.1-20180530041549","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJUlIHuT9yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"5981e65eea941f00280d7510ea6fb5cdde8d4079","_id":"@atomist/sample-sdm@0.5.1-20180530041549","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-MQZAX3YPe5VNooyRAMobmB/a3dGapXrMQI0C24tIP7SgbovEc6kWuHB+1RJOZ0/UMeugzCYzvpTi2IZ6GHJyQA==","shasum":"70c997bf04a7f566b4f53a8e19b101f6170de1f8","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180530041549.tgz","fileCount":262,"unpackedSize":461140,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDiYBCRA9TVsSAnZWagAAaWkP/RMVYKVKvOP54CjU9NuG\nl3dEzCuOsiVUCbHvG7g2ZS2j8eAHC/MG2A2rm3w06IsuMrLYcrkolLD7Ug+G\n86WqrhPyQI9L2QuGQhjWSgo/ROE/mVzo9UAcqqJXRyvnwER+4QOanIQIN6A+\nXsolk/xnzYOnDUdeUqwDa1kZnX03YoYRkWkrJNlDADc1uWMzYTmombUMfK4G\n4qKRxBpKhxZyClNM6lgW/h0wr1c5aucd1kewTzmIq0Byik9HhejXUxxYsavw\nNp11NZOtNdGx2Tjlfb6/Ok5imqDgvXDEcjNbOd1Tplhlt22AavOPWZCbMTWl\nutiRHVbf2M1MVim3hz3SX/OjKuoSd6ftdK44MKs13bZ1y/ACdaRUO+gMUd8m\nn8WOFPmqaSXQxYtzrQvyuHncmsmda6d+Vntdusk5cLw0qlqiPDK8tSoP6qOt\nvXKcnosQMdozF8PZ8vkrb5F5NfJNxvg1m2HXBhtKSw970uTmHA4ptKxJfzE9\naEjiKcVu+U90vdEt405MEluRYgTjHj3Pg0MDzfNU3EbD4q4kuqWb/41KLqFC\n9BCXALTgfm+kpSVH8oy5jEg5z2gpuc5NQWCsEm49WKKoBSDHU1gX/EOyRjL0\nBsQHvgPyBB0kNEFgYOkkF5cpJnnkKSH6H8of0ORZxnse87JN826/x/h1ydKH\nakPy\r\n=HLog\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDI6eX1/fUZCdBj0X+yt8oF/2lIcQpjjxCbEmnV22XQGgIhALnqQPsC5HR3ON7KlmJD4OnhOdF3aDI5RUivRpc9Trj1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180530041549_1527653888013_0.4256061284576633"},"_hasShrinkwrap":false},"0.5.1-sdmupdate.20180530045331":{"name":"@atomist/sample-sdm","version":"0.5.1-sdmupdate.20180530045331","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/Hk7x6p0qjJ7","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"c764b3cf347c513178ccdc68fa36ffad9a561576","_id":"@atomist/sample-sdm@0.5.1-sdmupdate.20180530045331","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7LNKtLYE8K2OehTYWMyi657/CmJeTRo5mwleogKVd/lR0tMd0MJ7enzmUAuzvlU3c8+5luGm/ecvcDkB5E+iWg==","shasum":"e4a5fd4d945e13277468bde4d7726ca7d3f278fa","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-sdmupdate.20180530045331.tgz","fileCount":262,"unpackedSize":457247,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDi7YCRA9TVsSAnZWagAAl6UP/2wk+1yN6yMvswIq1+ti\niRaXLIqv3zMLV/f6EfWnekqvz9uscDSoaIbMSm23blGXw/OIQ1Rg38Mq360S\nNWnT7c+DhQJLAkPNPD2ethPIQkPeddKO3yx15S7haMIbUMW4183n9n3fARhX\nMWShuWwtMGSHeV9IvNuDYX2ZGpAnKteQanuDV7rEy9669Fq/X9Z8q86NZH9w\nlPwdhyYfo7s2Tw8l3AC53rw59RwBUwadOpVVmGDPGdn5mLTS5MwzvZXBdPGK\n7pNUYfEJSF0sg7sQXEOyjUitwoHVWEZ2sjc53gpnPZlAyU9mGcRBEY6d9O9U\n4b09Mgkq1szlZzQEqX7lWPZxUJ+BHboekBQsAQSQv/5K8zKeTiWZOcm1+ChL\n4PXUchMxYAdFx6zP7DlRFNrZdQh/RSVxPzvpnMbS8QqKapVWpluG1y5fLOJN\nM/0qzLepqyNr8oG1+53zdwaNaI3rRdDufvWICziF2SzHN+SBV8YzFvJKwDgI\nzPp7Tz1nERkvITow4YhO/hGE+f4CEAZQuqB6gnvXHtKCakHPwJdfFta14EqC\nDfnZHUOi2wzKW9Tf+lTxPn62F7mZb28GZMbJUwvySEZVZCl9BcHYV6TfbRbU\nUG6WREw5O8XBmyRMCCAAmlAn7WXNYo4sapZktApBqJmLIJ42IRo7l4wV9l+4\nVK5D\r\n=5E8a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEYjp5tv/StltggTEQ9N9FyA7ax3nw00Ii8XehDZ86O8AiB+FFdW6tmTrCiutBeD1grjXguT6Dzg+E6mCrwZtUi4Qw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-sdmupdate.20180530045331_1527656151629_0.5214300158503133"},"_hasShrinkwrap":false},"0.5.1-20180530051834":{"name":"@atomist/sample-sdm","version":"0.5.1-20180530051834","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/Hk7x6p0qjJ7","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7183a7731e47c09b4ea054ac2775a904a12b8938","_id":"@atomist/sample-sdm@0.5.1-20180530051834","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-tpy06xi4mvECrU60yqrVtYcDYIyU22czRUJ/6mP/nuTH9OHGFFv8PFLMFe0CQcIRFXDxDfrrEf81O6KrjpxEcw==","shasum":"60bab8846c699f386d425f9272585f2577bd0bfa","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180530051834.tgz","fileCount":262,"unpackedSize":461477,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDjTDCRA9TVsSAnZWagAAM6AP/2mt1FkBXQc+D9piJ/YI\nwg7plb/UaJax+yhTOw9krWxldaW44J/yTl2sfO6k9VmPs+ht6851ec98enB0\nQKvtk7/Oo2wFUSkuP9NnQbdAxnX0yBuZoI7nu2+0QKsubhorJ/UeWJYaxZEu\nQ23xK3t/kYQTsdXdMG9rf6mRmv3y270gpKDMQIgxSm7XYNI9+uqoslf5VHm3\nJUjR2hdAmo3t6KRFwKwN8u6V/PhvqU+dHqBx5vmqEkto3upFOXTP4wvOZOX7\nk0Vq2hMzNc3RgAFJhpsNNAOTe3ZLUjTKzb0jQHl1BVS64mPLlZGrkksJeDPJ\n/7WgCW8HRFPacA/uWitk7b2RrvFaJPuuQBmTaLm0NbGrq/zornQ9X8WngBF+\n8JEhZlrJ7GfSXrtP2n7HClschz9eLBGhvid5rHMF7SEbffTIVPybpdPcQLUJ\nS4yWnJNf1Qjj0omxSxDHGOqn5brbCIovqruiPhzLyE4OetONRSmxrwnsQhwZ\nPZI7K/gWn5eHzozabvyI2mixU9H9YECLRoUvZblYLYvPRGbSJKqyC6sdilzc\ncfkSRge1WqMtqvmhG6I9pbVc9rIRxvD50vQcZHlAOKxQsL9lXMqv/79HsucO\nkBzaGO7fRvCpL/Om0GV8zyDmjHyym4XE3EeRJuDh5+f+vJspyT7+ZH75QVwx\nQ5yO\r\n=T+j0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHn6zNfyEhYKaVuvklKmQSVRewAID2dOAuc4ujwLIvbFAiAexyUhQOVr7cStXeNTtsSsvq21FGdGpFwmGHj3VyFQqQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180530051834_1527657665564_0.720242811181022"},"_hasShrinkwrap":false},"0.5.1-20180530064720":{"name":"@atomist/sample-sdm","version":"0.5.1-20180530064720","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/Sks-uNu6o1X","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7e1e2cf62390e2d30a223d03d34f130c233166c3","_id":"@atomist/sample-sdm@0.5.1-20180530064720","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-RIn6KY2GPndCwcMXI1lreuWG+y3y7l3bIDZ2+8XFrjJHNLeD42zz3NZlBJtAzXyUwLytJ14BOtNt29FIKF6KIw==","shasum":"c85d4393460a6c2603fd08a51efe75c1a0fb180d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180530064720.tgz","fileCount":262,"unpackedSize":459909,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDkmpCRA9TVsSAnZWagAAljMQAI7Z9huTqX6/PDKDGc8L\nVAbjl2tM3V14rJHQ2J+ryOd0erCIIKyu+hy1Rje/QWtof2fxHxKuf6cQil0V\nG0Ra6Ax296vaoJhTcKtIi0skCO97X8UJ28LDleCIoGKp2+t5Cl1WscXUXYYP\nvyuLGb+89U+14Hg5WBhyu1LQll1e62ZZuVaP6hnPHJVwwLDqHT9mbD+VjUJ6\nvXFFn8MVnFoaSwVz2lRUvd5KXEpooDk+nbigkzmJoq5yn/T/xIMKVXNRDBkt\n/alJB3lvOx6ETxMSQT0Tfn8dhBirGvCmYnYYTOJvxFi83HBgqij/Ro5czjP0\ntTvA3yFVOJby3tEujIvYI1kpm8rCJR46SH+RNO0H6OHNinz9V+lbwkKVbdb+\nZ3TpGC6qAnLNamltrkeEOUfRQ6CGJ+QF6hMZO65fe/BPTWOyUCm5D9/GrdEc\nw0PIdcWeefxay3c0zAny/4i9QxyyAJjGE4tJ0kfnNfdk3NP/gEnrvouT1qW7\nTCLDhtqIqJJrROeuLuphKhyOrBl7IMhXWcbbiJsk4qgMUaDkvWWYNi4G7Mon\npyC36+E5X4wCN6hFMJvbZaj2LpiEA3ntivmPusLKfSj7Eo/rkb/IXcxsu6mo\nRwfxGw2xnfyv3zXfcaxLZF8mkMMwANS9nfqkULHxJPNBGgEpusAKbg7jui6O\nC56f\r\n=eoXF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDp7NeGZzYrFJqrrcCbqV2ZcFC9v07oJ2hnw1ojm2EUmAIhAPFFIVYofaEjtWytBw5R+RQ0Q2wicVi9PXFrNPsfo3AT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180530064720_1527663016888_0.27795373750075925"},"_hasShrinkwrap":false},"0.5.1-latest-editor.20180530125705":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-editor.20180530125705","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJXlYDIG3yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"c4a755b5516657109ce4ddb58dd82504f43d0f38","_id":"@atomist/sample-sdm@0.5.1-latest-editor.20180530125705","_npmVersion":"6.0.1","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZDRraRmbLD32fCev9ME9za5VoiHMM/hGcpBILtcC5bD52uQvQhnBRHtJrNA1qGxkVxFbEnndcU9hk5VwtWrIAQ==","shasum":"6fce19b0dfbb134735d7b73a1343fd89e489160d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-editor.20180530125705.tgz","fileCount":262,"unpackedSize":458829,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDqBACRA9TVsSAnZWagAA5cAP/iyRvA68U3+iIj4ohbPX\n2tsoQD+3bAjOkJXUJNo4t9ObqARjrMRVnviwT8xNTUxQk99skPPEvyW/oTEg\nj2yeNZFCmQ8TOJtFG37zRoXSXcUucqTZLhExRAl4FSfZtQhBU4QLByFxg0rU\ng1txnmflMQxmgVM0x2gLuZBWy8cVM9q2IoVZzSs8iRVofoJbowYeDFXnmtze\nALg86uy1hzlLWVJpDSf4dBR2ZYWu+kHVMnRL9xjHpyqeCEFqn8xAnv91nfvv\nMeCtTfTOANjUtTp/T63ZfuCqDGK4mICy+uf4+N67cOIb8QkgLpYR1DftkBCu\nb4bhZ0CNvCW2RpJNKBV1sKXr28TwwujPZ+KiWvcoozmyj2uYDuq61lJFn5f/\ntiOERaQkGmeTW4wjX1QuKqLfqhNkd+GCQ02UFCqkD6kJ74e70A5WY9FAVT8X\n6Xcjtd/bFBzjoHdWZqsV4mx1MvLyg1pPNj/Q/Z+AFtcAfl2vONbB0rnDDNVF\nT6FCXtlUzrBoMc35c6WhNmxn2+aghke2+81ZypzGzRytS0kLdBNDwRi4IIlo\nqD/TczxCI6IfkE7gEBfdHktvjMw/mZjO8l/XbY67Z3GTU2nKGKtijmNDGRSz\ny/pDgz2tuGyW2rOKzQRqEQzs31ewRCNS1MDpVilRiNS1ZJLemK1YZyUmcu0r\nbkGO\r\n=tJKt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG8M1rKX/Y579hhZWcVXhcfVNlDUrRMgXiBDXIh30WuWAiEA3NoFeU145ffiawhH/1UwjHZFmemwNghKdOvqrmtANEI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-editor.20180530125705_1527685182887_0.15071864699978965"},"_hasShrinkwrap":false},"0.5.1-latest-editor.20180530130944":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-editor.20180530130944","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/BJxzuM1V20G","@atomist/sdm":"https://r.atomist.com/BJXlYDIG3yQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"97912198c36420b0e9c639f042a24384e6288906","_id":"@atomist/sample-sdm@0.5.1-latest-editor.20180530130944","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-I0gR+NWODLLKFdQ9RGcXQeHAIhzJOB1z7sIvUqQM4UR5Pay6SzIAlNNkjuAk9sYqURODQvy+gHhQGaleZfrJZQ==","shasum":"1fe679edca91729c3bda08efe621dba164122c51","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-editor.20180530130944.tgz","fileCount":262,"unpackedSize":458831,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDqM1CRA9TVsSAnZWagAAdIcP/RI8HxgCrbJfHM23TYs/\n0FnCfUE7TUwYV0nS76XicBGpHsYHBrRgCwGKuSE/hvl+aEeywogrkFzgM1dN\nqSXKOJq4oJc8CoWt6WO17RwgFqE2eFShPl0IrAIn81AafeGv95tCP95I+DqZ\nPMxrVzVx1Tu3zIUXINttGioHzZKG1v+zzaW86IzeRVZQJmiwbZb6nR6Iz40d\nkLh6kia4xXT7NeXqQlFamc3bDQHpRw7AmPQwpN2jzaeQCAJC2SER51zImlxT\nT9E92uhxdEuDGGmU3n6flMcs8FPu7AL2MVZvQxk+I5PXFZZ31ReWx4ueXgFJ\nQQo3YCL1r+YmK7+0Rcrf1TEoJXCviSybaepXFh0SfbhF2LDnRI6fPI4Gg9k/\nYnXdTd7UJI0I+HPVNn6Cm7OTxyuvXDphtj3KcsJ+zC1mlVdXLV84RaoqrihT\n5HrXAalI4UU6F0GfUE7oZF5pGESRfpkR8eZGuCBbTUtizV1P5Q5MvWFQTVMb\nTESXFMmpfWuiCNEAORo6lrM8AWE1oG6CrnhpYN6t2xoK31qZt1phz5yTih1o\nxgr2Hv7ZfRGFWxmabZzzGtxdeJo6j1jPZmfUXaxXSYNBgnUixCDE8F5rmnG1\n5xI/MYlHRwyGH6/fI5JfEmnPXJ8CvOA6FHRJAZzfXjaSf+ubWod7/6FIBrRJ\njMNt\r\n=aFBY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTcQUMTgfUUSVMKGmxsg0d7lG663JNVKM+gSg/U0MteQIgZCGh1e84YrZwJ03V+KK001L4KfvzvF8l6xExxeEcbOk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-editor.20180530130944_1527685941097_0.7788864450149795"},"_hasShrinkwrap":false},"0.5.1-latest-editor.20180530165338":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-editor.20180530165338","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/BJXlwOUUnkQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6966cd079312963ddad2eeec705cc9784a9bfa03","_id":"@atomist/sample-sdm@0.5.1-latest-editor.20180530165338","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-bDIEW9yk5ee1uM6e0x33PIVFJpSDihWR9pecHN+9qfCTSoGVqcvaeQqoJpuxYU4ZZlTiYGPYNtJXtAFkHzyBvQ==","shasum":"e47f005cdbab85d0c5c6110a04bdc5bae4137218","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-editor.20180530165338.tgz","fileCount":262,"unpackedSize":458830,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDtfcCRA9TVsSAnZWagAAXzUP+wS9Km/i032gWUd++QaP\nItSjMnw2OHO748fC/UnjYaLSvYQmhGGmO0H0+4oJy2tG2AkiApL+2ROCBMzn\ncA+cs8hc50LUrJXvw7cLzIo2JrIpFGXpZ+XHDcjr933m3IDGti467f/k759r\nPAe0udJU7zDXXBJzGMQcoOWtLavCZwj/dmOsHKuU6IrKF9BSUFJQwhKrPjbR\nX0e8hQk/A0YOkTVdq9A4T2FBqqpLbi2PVBt9p8UiM0x3UBKhvmRZWM26JKOJ\n7tPMvpBhuGhhpZ2w+zrUedj4hEiC0NjRSX9v4I4tjLAfBy4iwOb8lOklsslz\nTmCT6agXmHQDGaIevEZrvGK2hYMerbzvKmohQrxJhQI+PQ6SXuewJ9p/bT8W\nK1MdYtqJ1Fert5hdjIQWaovJO0tnUulX5w9O2YtzyRpVY4VPWXH3KQ63OWg8\nYcbHHAXfxCXoKXmk8k9aCtCCBzskNY4+IvoURpZlnNEq2/RHC4lfyZjfe5qv\no6swKZv+i5/KgzMbAL19CZmd7WRZXW8a/w2EnXNdN/NkyGnccp2yMSlhMn0Z\nJSzbYA7R4yEispyfSnBYSt3r4FwkGm3jQz76I/8eiwX8pQeK1NXEtgjAKIPe\nJnNULChK767RQR5vOibUIOl6GH6VAzRa+6OB+i6AnL3HlWI1o7pluf4laLHJ\nYwSu\r\n=4WrW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHEX6U2mKraVJPlI3+fkbNFReg0bl63+yUKxUlYJl4pWAiEAu9opgWbBSaicIUz1HNNtrM4/3G0tvAlNmhpuKwTDaUA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-editor.20180530165338_1527699419698_0.9359510319410687"},"_hasShrinkwrap":false},"0.5.1-latest-editor.20180530230726":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-editor.20180530230726","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/HJIejGkjnyQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"bf3d992c2d542538a9de29635e50b4e2a67add15","_id":"@atomist/sample-sdm@0.5.1-latest-editor.20180530230726","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-gXSyEkU4C1g1wd7X9tFuZupq3MStISjWWlKZ3ptH4PaaeYTGQefD03c0s5UJTmtNXfuheSF7HeCrHoyi5F7tGA==","shasum":"d298b55c8b2810e2d787184537e9eb51c06bf6ea","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-editor.20180530230726.tgz","fileCount":262,"unpackedSize":458830,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDy9BCRA9TVsSAnZWagAAOL0P/R1ndIIjBhOcWSRD6Ld4\neb7B/NKgwZ8KRc7rqZjIMq6k3VPhfCmUGEriKLjrWdE+FAvnQFvSOD5E7TFI\neoJC4vV8rPcv7gviZT6xty6OXE0Y4FdxA6+4BaZse0hiafDufIt7AaCKrt9E\nkj7aZnPulKnvcfDpT1STsGi6Lga9L+UP8wwZUp0NdQHsQrTHT1pAMlX/c9A1\nYiLtwwISwB1BTYCyzP9zDgTJSTrZhpcXtgOC9VLto1Ow+EUGkg+PwBvKW+Q2\nqdc/WoD/8jM8J3yIe4/zTtq53D+zyyoyzqLg3t9n9BOSeQmHjuZfyOChlPdq\nAj++U8iONJZ+cOwxydQRSQINPFxn9JjWhUHfMIErsB3IthaanHWuU1sDUD1+\n2BT1NoL5PMjydspLdYKd7N0HLcz9SbsG3Xva980N+KHMhpKeTwIzDTG2v7GW\nkx8wLQuEAcpkbhKgAgPASd2VpinGkX3NuaISe44pUo9YUbVbRCxf/Sn1J8Fd\nBs26vUyjpdUbc5d59r3H71xUmDV0rPFGEwHfrWkHGHqjOjkOV1oOuABBQ2En\nXlAWbcBUmT6n37iLFQ+qqW//33Zf6AxcbdClpRosMyZqnZahhfFwQgvD1uwN\nNgvJOh6r8k4LeWd3VpcCfkOJ/uZfqlMoFBQbfzGAm72IkDR8Y0nkacvkVe0n\nqrfA\r\n=slZq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEg9N7gxueoN6bGhmbISnh9gUeJ4XnuO8/G5Qjykuh7AIgfNo0gplV7vAeasYX+RIRVS4xR1gpFiJ+XPnZGi5888I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-editor.20180530230726_1527721792795_0.4525329500622166"},"_hasShrinkwrap":false},"0.5.1-latest-editor.20180531001051":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-editor.20180531001051","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/HJIejGkjnyQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"c9de333bc2f389bc0f51224f93f461fbee205b6d","_id":"@atomist/sample-sdm@0.5.1-latest-editor.20180531001051","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-5Gy75ZeRkbT/KRCAV7Nhn2VrHYXY2rgS2a1qzDiHn+7E1rssdeT5QNuMe9B5ViucCGwEFULlqqmxNIKg9cqLeg==","shasum":"aa35b0ea1e8e85332b0c70676a39c4fa45276f4e","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-editor.20180531001051.tgz","fileCount":262,"unpackedSize":458754,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDz4VCRA9TVsSAnZWagAAPxwP/1zRy8gWEvkGhyxy+OpP\nxjBd7k5yeO/Yggf+Qwr+DmJ2XBUECFDZ0/GZPEce8AxrMet+OGm+HDwLsbh5\naSHc2J54Fy/0GUaU4U5FDQavFEG5cr8dG7ow+Mvi/nkv7JSz+TsiwuSskQ+a\nB1SYdceylZKo5yTZPwnaB19xmX064k8VicazbOySN4L6ghJbtBCoYmia0lAv\nF5MthDgGwNg08zchHJGtEpc2tqlDXHtuyq4ql9c5hSpJ7nUQYf/EqeUhrxuj\nuFhuZEdY3GbRkTZMTaMQoYWrgo3haH2Yv27qZ5lQ6fOEEgoUBt9TvGZlNGOY\nepOQM6cEkwMf9RZ/xazNo/SYOcu6k9PiP6c0u0ooRGgRvfAMCINZetMI1dj6\nBUxKvXXcx14hF5/WFU/3Xdmir4ID8+J7unsovE8bqk6/qDcIWfCguSOaOpTI\nCPKQ3rw8do2aUI2yJMQbNE56qpUWvI6dbIM0sOl9f6S14YJqmPDwJNoMxPgU\n8SYeYa90EhWs+3Dtbqy5hSzDKfo2cH+LECyQjf0ETjcjBcpR85caoAi+uM+1\nx3vbyDA6/DVgdD3jjKoRY5xhmk++kLtNql/+yAhCf0kjol+49oBnJj0ud0G8\nLHcDKjtYY6ISPo9Mg76AWRE/HiiNo2uMphLbw7AwPW8xT2SJVoJCkS5c4/nd\nsw0A\r\n=jZ1G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH+lEEOnw8hMp2XYcI6oyDgabNZzsuSVRSPdCDoejUTTAiEAhFnxUd5tTH92yBMiL0UR6KdTqN5QuQ21Vek+9qkDTJc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-editor.20180531001051_1527725588678_0.9300059877819564"},"_hasShrinkwrap":false},"0.5.1-latest-editor.20180531102924":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-editor.20180531102924","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/ByXxyjQfakX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"5cb9995f8af627dd4dbb2069e851da9c0519a695","_id":"@atomist/sample-sdm@0.5.1-latest-editor.20180531102924","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lhmmJ0Kvvrp1K8yhknFkySAi0er7oCm2jB2gshx2SbZpceFeLM9ZxBaFkhLxHHmwMoTp0uYUW0bg2gzneaPspQ==","shasum":"2c1e8f2f4f029302a8d6a944666716885b233c6f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-editor.20180531102924.tgz","fileCount":262,"unpackedSize":458495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbD88tCRA9TVsSAnZWagAAHGcP/jfZF8T4Xk0kbB2h4sji\n4MOrZOCeB2LSLMuZp6E1KyWqbYFHnYVh3ubCOPbIBy8vyVbziQvD6K6uuGd4\nmYiYlOk7hUvU0onUSEtfvtRGu45snKL+WThV1+Ob7TRAYLNTcxjgrwt0FfQM\nAjW/c0m7B3wYR9+VgPBTTOQlHStIhnM7C4+vOYuvnHxwN99ZKQdjoNjVBi70\nrWsMdvrK/rHFvqxrHesAnKzfzmyQ/1NcaRcHGPBnY9avT/Vj9WBD4G8BxkSl\nnqBxNLgP0mYXFJLwfblABFvdu4lRWtx09lHsQ8yhzBQJk/fVZ1CdfRr+addH\nhMQH3Y0GGS31BYhWY29UhCZtFyP94qMnyBVJW9nJzwK3W5Neq57z1M8N91hJ\nnWgLdPrzXwh/FhifbprC/iE5/1NakxTi9qZMhJ2wtNT8cE9T1PRNeI+Sh+Up\nzBMsP3/TwViQiKwa8m9Dy92rLX6ZP5U0aD3hUYraO34xD6dsMDx3NKvGkB1a\np5bh25ZUcuR8mpnPS0fPi6LqUt2cQUgZE6AfWnuFcG/Ecb3l1MDSfkyJaPk8\nXY09ujt2huXCHEHLVGobFayh9BkPAi9GHRcIWxzM9EtlqWIHcfL58rB3ke7p\niKAGN+mHmmfzq+yUsfPyzRmGVHuTGJC3tbw9r7K658nhzk0s9gpixu+dj7vw\nqGt9\r\n=SgGW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDoduRKmqq8jqajJFzNdHP/Diot+1xQM17zci3RCYJM/gIhAOtQro9QNVmVOUHZcw3NmXx3Ca7sgdTYcMRnrb9dv0+n"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-editor.20180531102924_1527762732652_0.4716864934800544"},"_hasShrinkwrap":false},"0.5.1-20180531121448":{"name":"@atomist/sample-sdm","version":"0.5.1-20180531121448","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/ByXxyjQfakX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"51419016edefcc951d954c56dd5888830be9d4aa","_id":"@atomist/sample-sdm@0.5.1-20180531121448","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-2ekEEZ2K0xsuu6TfPhMeuuPGoQ6aU20WqNVehxWBz/1e0XfSRFnrkPTh0of+gu/kKCSfNMoi1mUPs7tTuPHKtg==","shasum":"25aefaac768ca3bdb1601f498aabaf202b01929f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180531121448.tgz","fileCount":262,"unpackedSize":458481,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbD+fHCRA9TVsSAnZWagAAjkMP/jAgv24gM1RLjaQaKmRr\nlNsfkgGmTu24qgpxGbfq3lYLoJBsQ/GYGub2Z8FwsPBeC0vfO+NYLK3iBICQ\np2U5YqkXJ0kHI4ziFfImwchn29pR7SUjlkXqRegKuwzpH7yrjcaT1HKsHXH3\n4bn2O+78Y0WyumdL4ZYKn46BxFU3DuJLbqBp0NbdSmoV3UrWjSfcRydsxEAf\ny9IAOXg/Vy+bwL8SeotNl7m7nO5qfDlss5sLA7qUL2/c89Lw2a9EsAcVy4yX\nvTnb8heFgVZEM0ecK0UAyVQIZSeYZt82JzyFagF4ML5THtCHYtloZFW5EuYI\nWl26iKgML7dZL7Z50SlYojSbi9ZLijc/juVPKtjmHF5p8n9G6kRAc2iGnKoQ\noV26gcYXLYKCE4HAio5n++33weRA8GO4KJHFPuuRCOcZQkARtgg6+U/IPGyS\nw9OHbaQ6ncIByIaNMGbaWS5KJzIvKvifekgD1hUENVCUApmI1VBGLm5/ihQ0\nIUq1NAMxtq3upjW2eQZGxmmJ4L3PvR4xWQoMl558KxUaE9hXZ1rxvKjF38l4\nMsDaDsM19dvr2C6i56EwmkBRZN+vuO46gVP0KIJb95BufGiRyDoh6XaPGQdq\n7YDNKY3xdCoHLU2t88R7BeZpk6iQuJ9HdmpgzgpvacH8OkklMUKaFIY0HcLa\nHS2B\r\n=U7g3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEnSgd82iqvgMfLj7+7F5BQKFNbaQ02RLYyBCdd1HozAIhANADXfbG9ErWS1mwHjCgbNk1Jf9v/IupRASZq/iyNviw"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180531121448_1527769030486_0.15288479187698267"},"_hasShrinkwrap":false},"0.5.1-20180531191428":{"name":"@atomist/sample-sdm","version":"0.5.1-20180531191428","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/ByXxyjQfakX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"220bd871f916d042e03b2dd709f582697859dc53","_id":"@atomist/sample-sdm@0.5.1-20180531191428","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-j7v2cy9wbP2CLySAOR4oAlHHXeKHD8evXPXfRxJPReXO5lvZOm9td0fQpXs45ufEB872hbr3M3H5t/gBRWex0A==","shasum":"e66d44e0feb77869c89083b0f696ae3ff73de3e0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180531191428.tgz","fileCount":262,"unpackedSize":458495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEEokCRA9TVsSAnZWagAAP88P/jIh+cx3ZvWTDwjEVrJe\nT3qONEL1cNWVJ8mevULLEq3U5arx8iw2dYpmUKM7DWTrOA442lURwvTYUd6j\nIEsEkErq18C18w3x3hVZfBsfyFuNkVsYDs6Fdl7hXZarIts0e06bqDiG+IaK\nWFUZ/D1V3WTtLLxveAVXGS4EtWoDF+c+0H5V7aOqA4n8zg89iSK3blYs+bG3\nFwH/hWqdrIhEYO7fBkpgPKc0s+Y5GDYK9gYO+7HC07GgawS8VSmghWTWe9If\nvQkNZYpyPckRxeyyWTs3ofdTPKssrl2qz+T1pDuiUXpWRN+Jpi4Kiq+1UjTe\nLZOR67IJ3V0pqFYa7Kqg8BpR0HLqdylKGqsqHANh9XZCLIJQZsWnZwdwZZOx\n4YIDCOVfm9E98vQLZPW1TomZ9UJpiTFmvDcVduMCw6GS7f/XUAd1JiTSccfn\njhi6vs6vJL9Y3HZEGRjqAJX7WiH0/esBOUCJVl8yY1fjRr8kmQCn9NSj+tb1\nitMctyXWh9rzhzdwcXL+vrpD6LG6jvI9lrC2WHvZb/fpzrk+BWEbpcNrAdvI\nHa5jnfDHN47beubmGwjZYJJyY51g7lmiRL/8RoY9giVr7WXRVM9qaS3nIvFj\nM2EMpT9xgUFyGPAUVSzCwjRwwYgFT2NToDiVmJBulNuollHZABD89vH4L8e1\nMUtV\r\n=zcvX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDilOGx4O2LkKZ3PiA+6obyi/8aPSWHH26Qbet3ziAziAIgD0eG++v3shXSt6poQUGmd10m8V48hRtBb5UOv7Cs8K0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180531191428_1527794211080_0.3761019734754103"},"_hasShrinkwrap":false},"0.5.1-20180601002235":{"name":"@atomist/sample-sdm","version":"0.5.1-20180601002235","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/ryDgB5lf0Jm","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"22f2d446a68c4789d0edae8fbe3eaf2fce31bdc6","_id":"@atomist/sample-sdm@0.5.1-20180601002235","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Xrd2ppr5bM3bTiCewXAEw9yEZNMNFwyb/wSBlnGBybt02vqKI5fwDYdb9ghe3YcSCCdSfh9+DqYksxGorFOTJQ==","shasum":"4e27c38db580e498533d972b8968f6cba567eaa6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180601002235.tgz","fileCount":262,"unpackedSize":458495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEJJcCRA9TVsSAnZWagAA0hMP/iQivfOzAYCdarqyYyKS\nkpR+A4nGBOJROXJ/tQtcJKitkwTb+9DDc9z8tmMXXoTVC7F6FRYnW9EulX90\n4x4ascD23tk5sTHDaAaffVkLwcPc9kbQKI8GAdtMYRKNRsOgOISfs2bhe2Sf\nkcfyKRBvMs3ALLE0t2FAP1LPaHx8ePNJ8WB1CbWxhXnvM/Ph67dAwFbUqdnU\nL7TejnHIBFXrALao6lgCYUVPJ2DYRlhvycjJZ9m95yTAekyk4ETlUJSOI160\nNBzINFsZGUp9n2f7jUxX35trzbUWnhryqsOv4ShtT7+hngQ1OriuQaxHGjRF\ngpv7Wm16CjOoZjhcr33JEwbTPxaeEHWnoc2/g6VUypN2jmeUaZtxuUziZXQQ\nd/amRIM1Qesk+wxpeXcVDMY7B8KBzKu6YhUaiTmxkc4xJovVPOxaukHczXjc\nbw0B6keL0d2VJGFE1PeUFUVmt5KySDK7jX+jmdzm2pPJpQ+4ceFHLv4s3Jw5\nIs/UB5zvc/aMFonCZXs+rMTBXSNZtENr97Elnd9r5LxtqOqsa01ITTl0V29p\nbJTzo2SK4VdkehwAJk1goZUEe0Ndp4y+WRYKxwtpHUDSIpGdorj0KvuA20W8\nFqHLmyLOoBTmNkJLUuP+C/OLtFUzvL6ZV1dTpT9MKpAKzvSqmgqdZfJCiQbW\nw4cg\r\n=vnS7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDte+JxOtw+FRZn+6a8fdKDAsIsO1g3pNuLcHb1CYjlbAIgfFN9PR+R7EiyyWOS4Jj9Aqrajzpigg2s4yxHrQGXQ+I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180601002235_1527812699696_0.5585514155054287"},"_hasShrinkwrap":false},"0.5.1-rj.local.20180601084906":{"name":"@atomist/sample-sdm","version":"0.5.1-rj.local.20180601084906","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/HyIlQ3St017","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"fd689d603cae56dfd4f6f4fa4bced26db53f7d60","_id":"@atomist/sample-sdm@0.5.1-rj.local.20180601084906","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-WcP74OMO0W0qGNL7sED1A1c47/sO/tIqu3xLFZdJ6Bk01btdA1vtGYL0rJnMj962/f+F7mtIbh5O7auFjDDkEA==","shasum":"8c6f5e4cbccfc72f766341814e2a12b1766e02d5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-rj.local.20180601084906.tgz","fileCount":265,"unpackedSize":466822,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEQkSCRA9TVsSAnZWagAADt4P/0/5PVwc8LKu68UkK9in\nT9c9vpnlN2HtbiLtyytlTnWF5/67hjU5hhEDqrW8DzYssbjuv+I/2CsWVD6D\nWwogtdmKrfp4uWsYNZ2xpkptWgu/lUpTvg0fPInLtevCVmTEvmNKy3boVU2m\nmP7/H9UjL5DDkFCnW6a0zpiPt54fx2ADkcf8I8Wa04JmcmxVZxdCShM7xKE2\nLZvd5HkMYBGAyISe+kDTGdIlrVngLTkvR3YcfZM8rjFIHgCUDrv1GJMK3Pjk\n+GmZL/em4PYRG7xeqTU6r7r4dJpGgvp0AiZ+ibx5cYHli1ntOcTxGL4ytir4\nGyf19eSdgBP7bE4ZO1byV5h7N+3HmNgNM2TXZv66hYd0BjXYat+bUrBsfvhX\nCHghmhrVEZ0gtPxI+mCLloKzr902VdMmrcCnCYx1hmNjFaTXA76GWI/349ln\nMgE0cP5tpwlr7Y+B3DWozyV/gKEfNoUAk8zWmRVr7MhLrDRonVD1Tfwp0zFp\ntlOrSvxyfwXyAAjS0bDbenju6Gehjsap4uPY9V5FWqAM68PrKisvqsZ2M1cO\nL2Bp6mm0wGBUt5eyCgcD7uFuVHB55TgLSKKFem5ljADp8INBcMN3XryUy/0O\nq/7YRJfT0KzTGuPKHId3eqiMZ9sBGnsgSpz4Slhb4I7CM1eY8+dfwegNSfeR\npvVe\r\n=PVmi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUg+VHXHyqW0s5tSt1bHb/lecRccBQyqTHP5PMJ+LX1AIhALMyS8mlhrRFhnnjf1XFQn1wgV/eexTRCfoW88a9quTh"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-rj.local.20180601084906_1527843089668_0.812303189354938"},"_hasShrinkwrap":false},"0.5.1-20180601085023":{"name":"@atomist/sample-sdm","version":"0.5.1-20180601085023","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/HyIlQ3St017","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"eee646efd38c32c7df2e7c5788fd987f38ad08c3","_id":"@atomist/sample-sdm@0.5.1-20180601085023","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-EArgMvCa4UTIKepOrYg0PCVI1vcUHxCu0NGwF/+7NweT0OuQq26CfpcZPHwc1PMi5AoffX9JuZJZg4OYfxs6RQ==","shasum":"ed60e0db1a7d1dd03b73efd259294cbd75885b6b","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180601085023.tgz","fileCount":265,"unpackedSize":466813,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEQl3CRA9TVsSAnZWagAAftAP/1s9+GXttAUd3OWY9XDc\njIQR+Om1CETXoiKsuPcibam1dVuBnZe6/IACTvF5M8BRIfTFNpL1Ge7SxrD2\ngaYnX5hqqA74Vp/37FGA1Xw/zHM8yrpGqSmzJ3GoKyWiefPAvhb/20YG2mfT\nthy52hi6G66Dj4TSwheaxFeo9OPHoz+fjH8vvshDzeOTUdEiSDJwZtzzJnIK\nCTKtupPlTcJAYmaQmrhctYvAL37JrsXRtw4q2RtNMOhLNBXadrp2hJiyJx1P\n6oaN7h9AbiwaOiKxUpq1aZoUuT6IupZN/W0rlR5h5UJjWxGLZnI9XjN5ej2y\nnXmFve04cDV2XIEFXw3fIiIgwGg/sYlRYwbWuBAWoZB6lk7ueMPM/Ar+p4sE\nkU+aJMPRgwgN4Cp+bTPBG8GLMXUwzTZnPUGsZcctZc+yXBX/mm6gBCC5LbFY\nT55Zr0HYZ7A1wgiPcFUfT4p18N1Yxw3l9LTB1OvzJ+0pMuOsPFpZEdce2T65\nOpfJkyAvmOA7nDGhQc8Sd8/2e81t8oODCI9pOXJaDicbf6/IDD7nc6d/F/t7\nGbb9IoShmwElZPfEgCDk5KD1+Newq00Pyn/Ql0OTkSyfiYO/GWNAGF36DZPq\nCwS1KlGrRGlWPxlGQopc4NBMAvoYRREnoCYuwv90QLwtsJooNW89uMUc47sL\nT89o\r\n=GksM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICpXxW8Q1MQqwXlsYPd6ocAL29BptbXXE5Kg6Ih4TI7nAiAClINxEz2ZUaVGloI/CfqsjV1cjXsvBTW3SWfXNIgSxA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180601085023_1527843190435_0.29748305078750525"},"_hasShrinkwrap":false},"0.5.1-config-options-rework.20180601144411":{"name":"@atomist/sample-sdm","version":"0.5.1-config-options-rework.20180601144411","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/SkQlHyB0Ry7","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e2cd54f812cb4e133f405e2a390503dd2c288a3a","_id":"@atomist/sample-sdm@0.5.1-config-options-rework.20180601144411","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-f04YCM8jlnXLfNqDYNAwNqZkn0IBPliJkUxgipT4qwrK9tHBccItq66IGwm2ouNH6pEuMvi3l4H4We8TPCpjVA==","shasum":"ba63731e1333dcf410bea483664e30463f689286","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-config-options-rework.20180601144411.tgz","fileCount":265,"unpackedSize":466041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEVxHCRA9TVsSAnZWagAAaOAQAISUzpCRMAt135LfF7J7\nkJCnyPU7gh1v2PPjYvapTKX7CJ9K6VP1nZr/yqWhIz6VWTVZ0rvzD3VPDxF0\ntDAnBdNJZBiWbF54H/PCv3E0hd9ZZ1Vdsu0M1yzrFCZDDDoFIxABayHTk4fi\nHE0QE2RJwcvCs4SLDsfacvqlGxt218AzB81bqPzUYo3F/0a32kQI2rcfV5yg\nsUSKgiNt+hkulEPbjJX0rGbJifEFg5BScsN1qgLtAUXHijPy2bGCSj0LGJlw\nIjv1d/DHMnx6jrsyC7N6BsmT9wYAhYaGlk/MXrQ7vwqeOJcRApEpQJdNdQ3G\n26VeuSJvG+3c6oG+4iQTq6XxYg/2ZQijugBD9Hx8mOD1cU1mvcoP4UzAkuY7\n9SMx+1+e/QFGQ/KKulFknj+3+fzKBQ9dCpuUJvQRrx/wBt4tABuIpfnziCVq\n/YSLEgniNvL+NOWQjouxiVfLkWIla0joX+qOOpIQU4IH30fs0guN1aErNl3C\nVd5c5mDfgj3n9N1u/KNhbjFeuiGGhtSwJX9eE3REBQ8n2lfB5pcdSpB/R8M7\nQNDQ/CGkNNqgMR6t/vQMVqOfy5MFLOt5KX/r3x3I/t8f3x/Lqw5om1mR1ydf\n0mc+Xn3OTNCbFs/XmWQ/Y94HBZk9RuwkPw2x9+lAR5ksxcss485CjX2FVkyN\n1tgA\r\n=mQPA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZY0XFEcqqlYo5dd2s8qOEsGwYmTqSjVNOGuKmvFAdOAIhAKKUPoC9HshemXIsyJQ6cp9mGDpiiBOQTmZWZalm8Tr0"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-config-options-rework.20180601144411_1527864390004_0.23625214121821259"},"_hasShrinkwrap":false},"0.5.1-config-options-rework.20180601145352":{"name":"@atomist/sample-sdm","version":"0.5.1-config-options-rework.20180601145352","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/SkQlHyB0Ry7","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"5b4d12b541d7ebf1bb6dc8b5a19ccf9f0c9f9199","_id":"@atomist/sample-sdm@0.5.1-config-options-rework.20180601145352","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-xJUSBJ3LB9otc7nhWIJMhlY0rWCNNcI8U6oyVw72G5B7vWekec8p8u0uPMGusNXZGSx4pywH55V6MvZZ8/JQnQ==","shasum":"b9dffa758054172b1a4baf7f767d2128c8839390","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-config-options-rework.20180601145352.tgz","fileCount":265,"unpackedSize":465953,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEV6RCRA9TVsSAnZWagAArUwP/2M5qddoLgAVRHEWAzWZ\nOM7N+P+O6W3UxHkiQJdCN5TQzyxxA3ugaCDYvbcnBKd5lYAdIEKlunqi5FTm\nDwQaozLDb4Lm+4PinZ85icqDyOzwlxyv0+oh50yqxmiTztBGtxzQlkKdyNv8\nmrJ1M9M+ARRGF1XOZoAHhtJ3je+v4I5HdCdMY3Ek3S8IE0dFVmg/KN0Pk9rp\n0d8MG7wjN3O8PCfX25+1fPUXbx5ScowMaTsdNJVtS5B6Kw6J4E8hbeNtCJWF\ntjbfriICtr6ZmMufUAbeS9xW9HXF9AMRQAIBeEuOIu3ufR7t8OBg+C9nMb/U\nNu1xiV8Z4tdSg73pwTk/JwMuCAZ8AkAyPz903elrz2nXED0wKWtp+ohmCBJC\n32gJo+4LmzmNWsig+8fLwS50P/OaG/s7FhMxTCuuNbOYuOpUCScZ6RhZT8UA\nt3SDvE4lMCLTUPXnObfB2/GYWJxDoZ8UUTAFHyYPFPypjetTRnGCWV6DI8dj\nil5KCkXvMRhoGTSSUQLhir6dzzwII6zbdu5Mtr3LKz8I3sA5k/q5noupVu/S\nGGYzA+ygDjLUTjgLHZ1nuTUrNM3gVyAQeeBRIrEIBKbjO6RgddRGmnQuT05b\nDOlLpop47HBd0bJSMZbuboCAEcmQlNc6+qkxGGSxygmkI0cJewcJ9JU7ilbO\noLSI\r\n=6hxB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaFgW2J5Er0fwoGQ0n0Pmxva1rF34WurkZkJpTt2dLoQIhALqzIaKbRsad3RRcR+xX2SnOThiqGJKYJsUCbtZseD5b"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-config-options-rework.20180601145352_1527864976473_0.38515051287540514"},"_hasShrinkwrap":false},"0.5.1-20180602033133":{"name":"@atomist/sample-sdm","version":"0.5.1-20180602033133","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/HyIlQ3St017","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3bc0c25ba70e7c87fd75033eca47a290eb98b659","_id":"@atomist/sample-sdm@0.5.1-20180602033133","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-YZYpGqli0gEv5Hw4KqmE9Z54Vasmeg/Ktp39lm0XEKi0ntd24ibBqxKLTt7A21qh91gTSD1pn9X9oCMFSlxE6Q==","shasum":"516c3623576a809e60d8eec73ca983da88ae8efc","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180602033133.tgz","fileCount":262,"unpackedSize":458803,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEhArCRA9TVsSAnZWagAAdMsP/1HfTAzeHdu6HmwOyROS\nejbfRoSWtYmz4k7Oyo8jVSoJ1PaL2DwBlPADPaaIn7GVNu6W4+rTk7oaATrv\naoiLFB73BCltITDDKgblDC7tLxKwBva/OWMJVbiW3vYIznrmVYGf0m59MaE4\nKmoWa8rqFdOKYd47hK2sQ0I0OHPn7CvYmxjr1WHearxkdEmnP9uvh0fVU/ZS\n2KYiKF7y4NNWbyOEGJ0rIHNEquk4ATSzgXgfTlKNpgk4qlvRrgVI2bfz9k78\nrNAuV0sUoVItso9XNpB3qIak1Z1p5EwTFZAwc01NrbTFpHRbrXJtFuLEKe9o\nsioUHYFxRba/nUt0c2sUuZmVcWbJJAt7qSvFpGOzRk34aTFtz+JXxUiaTav3\n+jPFAtlcYJP5gapgklvB5eqJqd3SnX8gwVyD+KxvdWkDEvqbXfZ/fNXQ8LXC\ngBFQ36SpaRwTOyJoD0JiZKG4rUDZYjm1tdc5AAQkhwKVXDLulxrmaHSkIMG0\nKl6XCbVbhDeOfBKNYU/u54bCwaKOquDgR1wMeDRtfws2Q6pCsUqY3Yu0+luT\nq7zGThseh/z75BO1zWf9X14NQFQsi47g1+t7oLoXpxuL9njlg9e1eaScFqMd\nkQqjocRZTgOwy9eVJjfQymp3eOIQt7uU7OWB6zV4hu5xlVFHxAEB6Zr/x6Zi\n979m\r\n=kxqA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDY3sA3g6b1gboszXri7wr+SeVbw7Cks7PbaqP7jAbIBAiEA4x5vcumLcwGJIChOMTIL+OIL7F1GJIQVooI9g8yBl4s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180602033133_1527910442638_0.9088217665833607"},"_hasShrinkwrap":false},"0.5.1-20180602234740":{"name":"@atomist/sample-sdm","version":"0.5.1-20180602234740","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/BJSlwsloggm","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"daf5c6b90a6fcd92138b7503cc96addf32233062","_id":"@atomist/sample-sdm@0.5.1-20180602234740","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-H5ucrP2cdz26DCJjkylXsErbZlazd61+po75dIK/mQWbee6K8PHmGUFSwnc3V557led4wpTV3brwZvTu2jrhOQ==","shasum":"8df0366237251847a60e720c9d8f572b4b0dcadd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180602234740.tgz","fileCount":262,"unpackedSize":458431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEy01CRA9TVsSAnZWagAAD3QQAJwo7b427fzJ7Rpg+hw8\nMcDtc3Aair6wtgirO3W64ZObC5BMhh4LWLMupG6jdnz9m5jolh2PQy/jI1RQ\n6dmHoWmgl5ed1sy0WkeL9j1hFIaJCwfv+Soum06t4sjbLojOejc/XRkkOJR3\neJZtOoBwRcX3KDX9jkSBxVVNegupq5jOrCK0Ew8epwNCvSDZV/UhS58yCGUV\nxqrDeYVK+90etUEFmWyVLpdvX4Xa6z6o6PJYuj0OcFz9EAg7IdmbKYCFGqEd\nUmrlrdGiw9O7D+Y5m1swbMddwbrGKPDMoV7rPFowb19rHtgbwkoQY1pNCaR7\nh4n12xK+KlWvWuV1kKudrPpmS7Rx0Sme2Z28Zt8LWw40S8lGq5AGcuBZsVoG\nsqWhtuuGKHVoPn+JMIIP2eFDyFYZFcA8kNemy55DTgj8xLLyAzpsAEHcsRal\nBI9T+CITzjX5dNZLjW+7fLesks8Pr2k81KyQyHvUgITjC0/X1pD3/CbZZHvw\nqyZP/3WmmdzWf/HB5H65LJh0hEsr0Enaa8ltxlqq372E8CJ1ytaqtt2vb/vR\nCJYpLbA1XnP/nGBAFWfCF+MK820zU0faEVrDURrJ+/vi5zqXIqxoqZA29ZSf\nd92ffKmc2tlVIfkQiODVa/SE0kVNO6rkejTAme2YmziTvt4ipuezWbFbtvcr\n5OGm\r\n=7G3r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICZaEd3zKDL8KvWSySmPNyp27xLkAKpMnwAORaLjTuzEAiEA+9woKx0dJfoQ+eRmYnb7tg9Q9IWYDai+iazB4R1eQ90="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180602234740_1527983411630_0.6608837845422566"},"_hasShrinkwrap":false},"0.5.1-20180603002405":{"name":"@atomist/sample-sdm","version":"0.5.1-20180603002405","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/SyXlr3ajexX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"834731850889e3e63c104afae1aee47f05ad38ec","_id":"@atomist/sample-sdm@0.5.1-20180603002405","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rLSMoPwQE3z564TZE+be5H2HK46UmnrutBY6Ts+fKBRWLUOX+5irl8iFx1U+hSo+bgTlrhCfx0vQk8FYZqBjnA==","shasum":"8613eb3df18a5dffb1c6a167b69c74d556c9708f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180603002405.tgz","fileCount":262,"unpackedSize":458431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEzW/CRA9TVsSAnZWagAAMKoP/1aZAcRCWvagg7FeSDDU\neuvMELdcTTTPIxSG2ekXUfOk8iKxdxel/Sz/nH4KniZEnfj+eP+DLPteEiM+\nZwEaGaJCc2cFWT3lND39dVzgggPPwXzWKW8p9v/C7/32Wn3ZdU7jsSkyhRoH\nmJLWk+OwPQjmW2EfBOB10t0f903QUML9H3dNugyicyYvFS5w81sCxiAd9LkD\n2PamtHOgFROX1UL60W8FdoLlXVGeYT1KWu13d3rZYq+pODObu87RvMpToY9S\nt6Of8QCc34Z56cbOlJSotLU11vFg8Wu0JfWe/s9NaFOWybzQkN7P4IXHFaDt\ngH/w6RuIIDGzC/hnqQ+P7/wBnqvx7FTXaklVGfABrjOhh7Djvlj6y0kDeJwP\n2IW0JVmLWqeEQ5pcnTppD4Ppkt5q2+x9PNyZOSbU0L/MOFOMsf40hQnmDo1e\nKVcf+wygmEXjv9Zrxc405wGmZgO0+qht6bsXaNvA5nk5SII/qqRc1diuabJX\nsPtQDH/P+S4tL1S4jn0pTtxjwLZz1jDV78BAOYEZ3oeWhYwUUQlIizwHCm3W\nrmIZJ9ZOOP/s8cYG+JDULCWSDq8Y36RPx4gp25PF1NH0nNdtRJsJf0EL++Fh\nFeUJctGA88da+5F6A1yQiCpb4eXcgId0DujM5ubfCPu2iZKpAknkllAxCwqr\nGMax\r\n=1h63\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBCFgM/H+1yX94Xu1kD+FbQ+qumzirip27xkyJBYsOodAiBtsfxdnrf5PICQ1hqD9Y8Wi4vzv6Ov8Zr2Lv/GFcqPLA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180603002405_1527985598953_0.8968827687497258"},"_hasShrinkwrap":false},"0.5.1-20180603063647":{"name":"@atomist/sample-sdm","version":"0.5.1-20180603063647","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/Sy40CNL2ym","@atomist/sdm":"https://r.atomist.com/By7lrusbZxm","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"074f1aace94f44fdeec2f6eee481708bdc5fe621","_id":"@atomist/sample-sdm@0.5.1-20180603063647","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-MPIHfGdmCB9aCQ/z+iDC0NpS83XN8jMceX2+KvAdQWgpHpRzo2vz3iRdaSyyip/9sxQ0OJTwzArjA3RwQLGiuA==","shasum":"480b578d94f862968563a2c0d4c65f17206b7c40","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180603063647.tgz","fileCount":262,"unpackedSize":458431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbE40gCRA9TVsSAnZWagAAS9YP/28EHfugdO/qoNNQfGIz\n9uRCUNabguLTsupCKjM2j7riP2f7KcjCgh/LoCOWvzxtBzc1jL/FFgSm6ti8\nN1aLApMP5UsNClunWaozcCOunsuZA2EJWH2WRqcUZowTFGkaQ/PP4XtEvPX/\nWHTa1KfzCxCid/US401rqt+os2irSUgNozjV/+ipwHrPI9XZCLYvDsTOL7T2\n9Bp9EP3uERYJ6K+g+QzhuJz9lSRu6VIy4obsuVwIKiCOBJcp351cMFsMxDXO\nXATxlJBOrJWvNspmd7C2fpZM/jfMGfTOhSaAblpSM8QX4ycU+1Z8Da7UZApr\nQXDrQdZYCm93f6VE3hLJLUqGJHMSmlpRYX+Y7R/QWBYrW7GNH+WCAnLuQZHw\nuR0KAiBa2AvvqExATawV1PGGG18kdX1J4hwsTbRBVMUcx3PpA41f1V0nqCyR\nExpi4YgL6X/5xzf/XNy+MdYhhiCPhXZyDiQz37ILw3sbeo/H/UajCLDMjCvR\nUOf5DAlLsTZvv2BEUNxbdwH8Nl5qJyV0XKTGo2oDwNZIUtLcYW3w57eUjIIS\n5bWhOuZ5JTC1yUnemxZCBk1ZHmnEL6G3xuktoajkIwr5SIm99CYQTfz4Bpnn\nzV9BylLnd8xWBnxpVJDMr0Z4hVHz2mtZcQ/XXGPNOOw16zTsDBMgmf19G30S\nxIxc\r\n=N4GR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAQ2C5mhMxN5t3P12dSo1rpTUliD6I46gCwZqRQDKBm6AiEAjFHSh/4SVT4YvACnmQwTDOUenqlOCAkQ5ZyXkajg0jA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180603063647_1528007966842_0.48492395467343385"},"_hasShrinkwrap":false},"0.5.1-20180605035822":{"name":"@atomist/sample-sdm","version":"0.5.1-20180605035822","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"^0.2.1-20180605033754","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"89bdf490bcad299c90d7daa9cfa5261ed1d62bea","_id":"@atomist/sample-sdm@0.5.1-20180605035822","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-QM4itkcG1/J4S2QFp8dXMZYJPy88Q50QcAGyGP9J+IsdmAoyK/uop4a2soj93Z7AgixMgDKBigxdF+WcXJfsPA==","shasum":"3f023b8cf0f0c3c1795d9d9de31ab624cce5e6e7","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180605035822.tgz","fileCount":262,"unpackedSize":459367,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFgsCCRA9TVsSAnZWagAAZeoP/iyn0JE+yO+I0vvHOcIR\nQ8AYXKfZazWhwTf6bGCJdp80dxgSEyKz0ZZmr/Nshi5PsCl9aAZ7A+Qz0g+e\nGe5Lj+whHFk1p7i8pNLlT2uZK9m5v/wBgNisx/Dy61hpbeT3zvop1QzGFONH\n408DkZDg8/DnpsRnGgVpi/cazBPnyjRpTaH0stSR8dhjmFBZp3VEkFzRvYQf\ngN75ECQHXFBup7qDvZHMwRhR54wnZJXTubErwUe/Rmk4pDyDk9odeWG9U1Fu\n1kqQRqXp6AGnsvUvNYImgmAWFjrJmmmnrb/QiIa5ia9URv51N26U5RUVqDQk\nXXNCEGU7LW7SgAR219JW/J100bPRUcJEEUTzOu6LYVWcbWRwIjsrQ0DlYvZW\npRbYBe8NfVZlHOAtB+AWMnvSVT0kWHSTGfzNAhF07TeU8IWuPZK+UR7DkwD9\nLUNxfEs3ZWK2/VmQ+sxeP/JiR+6p3huBLpalZfe0dfkE7WdD7TVQvvkcHpPj\nuhRV6GL4ehaXMYR0O3aVQHOQVnLOUjpsmoHwx/xu0m614VCKc6EbhyXL/KQ1\ncgbRE430biv/5pYwoTkmTKI/7H3+5JuOjrSr8tziDCBll+XQAD4I3edmpxwN\nOa6xwjwkCqZyV4kPRrUXr3MIh7ghHl4niGErEDjCy2OcBDTNuPR+bmAo/jQl\nCLJ+\r\n=pqbw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCbASKfBEiMV1DcLl5t2ICA/Xap7cU0hO0Sf9gv8aKsQIhAKzoPHk2guTVQnxCrw6ikcJwBhxKqBYXly5uaGBTgqDi"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180605035822_1528171264222_0.1966562638408862"},"_hasShrinkwrap":false},"0.5.1-20180607000522":{"name":"@atomist/sample-sdm","version":"0.5.1-20180607000522","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"08b0ff5a0914720c03e774e3d28d347550938e13","_id":"@atomist/sample-sdm@0.5.1-20180607000522","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ojITeIkvKcadFzLBwmbHlUGEOSGw17Z1aI2hM+m1byA4Q3ekYLSqq9kK5E47IxV3sVx4t7CotYlCjywNAy3Umw==","shasum":"3d6dc272ee97a524b395527299af5f1533af9a59","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180607000522.tgz","fileCount":256,"unpackedSize":451637,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGHdVCRA9TVsSAnZWagAALQkP+wadVyoy3JI+SwliF12/\nY/MJQNbfNrhjiMxGkLQC4YQEqlUR82bI5U5NN4Oa59Lh9JDGGNoMCVOtRl6H\nQPlJ6qviIpsFfUVm5fh58RR2VuvqYQ5UWQYVo4OEMbrpHWSAbHbSRDLYDSZh\nZwJh7so2cr+WUGF+FGjrKPHGoen5hNVVkjoaXC/EEPGiFez10EPfJyX1w8tL\niZYfBYY1WaWuIqVKjuEbMKIx1VI1fMgphG9pACG58Z2qNCUEN/3GzCxbw73Z\n4+QdI7ACak2Ote/KqJ29B1rlhXSElCMJBWjtxgSUeu/ekX+6xLPCSnP9uPau\n/l7cNrJ2TRQg2gFKDiCvkP1pXEfVT091VQvScHdS/CzdG5GxAfXei/L+Vg/k\n29bVrdNURy2ZjmDjRHKcZQj3VXTI2lPe5XVLYvJwKAJMKP3AHMPuWwoGULiV\ngp3LyEut8k8iGRUiSyFT7mdFwqbWaMvzEUuyNU/1MWr2Bhx1RgG9g30LyGAr\ndsrdE1Wak8SKrQLqjPRaue1KyV6kXEbPVjw2Ok6dITVxpAsWvwnkrMDnyYzg\nXccEkzN+eHrxwKcJpX6OdEZMzCeg/PoVUuOV8shvpWwnBB5jt/b/CzVxe6S8\neozh7WFxzc4SnHfyjez1DjHkNPhQDXxjXmHSZd5hVKw+t8OPgqpefw2K0VUO\ncLI2\r\n=8KHS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNfZB3uT9BDOk/M0mZMsCG3kx5d9gvf+1jcDzM+Vp0WwIhAIYqlHLlDrftq/mKq4FkaYAVYCH4W2Izhn4GekMBiV+d"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180607000522_1528330068391_0.23902024098250307"},"_hasShrinkwrap":false},"0.5.1-20180607231424":{"name":"@atomist/sample-sdm","version":"0.5.1-20180607231424","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"4203aaf8024f0c3e47e91eed52886989a7cb41e1","_id":"@atomist/sample-sdm@0.5.1-20180607231424","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-QjtisCsiBoTOtx3PVytnWQo5dO18T9m2r7FqeUIYEf1WJk2MpuqcKHiWtGJ0t7QsFq/58DvChpHHTC8H7omheg==","shasum":"3ff74a15fbe3ba2f9948ec0956da14cdcab11511","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180607231424.tgz","fileCount":256,"unpackedSize":451658,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGbz3CRA9TVsSAnZWagAAZfwP/3hdaWFXaU8Zq+ACFK1U\nBNgoauFZUnuSEHPSEleirX1wG9s4bB6yg5LR3U5Ccb1Agngmz84vL4452pM/\nGSZhh9pcj7tK3v1rKrouxXVNy/+2vaX3ItUl3CCGiiZWAkPSY7bsMP9olynZ\nL0+PZXA+1Id7CZK+4xEL01w4ynkzZYZJwZX+TEVwsxETvGz0GcuOdwOKkcbP\niN3Td7gDnyA/yK4AQx3MAuhS9P1DedUvYf8O36HtbpOTnTQ0aWzFJQlV4hW0\nZFflTyoC09cHRHEW4rbTlS87P1P+0ABIUW2p722G4+zL3norwGP986OAZomQ\nGbujeuKVIVRiH4FYAPOZu/6ywUKhepZ3tjDNI6/ZhO29WuSpAvJXfG8+uOap\n7fpKW8NuftDRVkpNxgwSWKQ/wAlRY3mDPUrkJCNr03OUEJARKyjjhYIoVDy5\nGYWB6LPsxvbRg6MhypjaPt7J3gM5vZuWcQto2QdOgOO+SCgPTc/oVtKvxQef\nF6y4PTK8Bpg9U5LxILAwT5rJTtnXmWbn1VyN3N3uFoUGb/DpBJWkvJ5fdEKd\nP4LutMjC4y6WiVV9KeJQJvmwu0ndqOwJ0zM8LJSC5EIkiC/EHIR6dSrYA29s\nlKfPoexBAVMUZUDciwET5NiRFtXnALpWrfeDotVnokinHXzFA9mCuO3Btil2\nMTXu\r\n=3kNR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE4siiEYvZ1xn6E7c82lVb1Fa2lM48iw9j8e0qNzJHptAiEAhUM6GO5l5F6qpWzJbwOt60rEnVUN6KCXfvUqu9/6h3Q="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180607231424_1528413430796_0.40560464709729294"},"_hasShrinkwrap":false},"0.5.1-20180607231605":{"name":"@atomist/sample-sdm","version":"0.5.1-20180607231605","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ea6c83129bc2de3397b7a4e64dd34f3f6d59a1f0","_id":"@atomist/sample-sdm@0.5.1-20180607231605","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-GMThP6l0pukefGPPspr8xaclFlpdEpiQdM/HDhOF1FYhhGaugAgO3dKtQrD98L7Gr3t85I6G9N6c9mY/ph5o+Q==","shasum":"6bafc98845606cb7545f62d030639fc764d53059","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180607231605.tgz","fileCount":256,"unpackedSize":451596,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGb1UCRA9TVsSAnZWagAANVsP+wRfQuQviIQhSpB4S3fl\nxnufnDOB3Qj0ast3M0MgoFlL1aA5EGWn8e0sE5hsgCOo4MNQxWRFBxtYGzQ1\nt1XCO+iAr5FdANkHIoItGBFboykX/TT/QdzzXECb0BsLafUi2FZezCr6W/UC\nCwcucRialFNCdvxRkj4IWgQJF7Fn/G+Lva/0sWD4z9Fg0dgdBevcgzNDqQKj\ngZEcOiXc+A3YNrHvanaRlv9vFtP5K2fOZNyt5OOVYBuZ6yQKCm4Op0DVZnA0\nS7GTtXXc2c62mi3xyKvQqqHyXnX1rB59bucW06Lb8oY4hSsGjSAPVFvSvsWG\nJu7RajGZK3xYil9r0tCzJd700wBpXmMNSQpwXN5BjBAfQJLd7At1SACHk7jJ\nqlV/7YFKsfTstmGrzVnO17sboOZFdJuEgOyvDjSZQATfQmw3kuHJCw7ru7Uz\nI0QFnTS+EJ29y8eTgVhl7ivlu0VF2nKVC+s/RdwIBKtplPiDOiM2EZF9hJCf\nKk/XmcCmYEDbl7sMsoUM6mCj1DLMaOV4C7kDWV1pfkxqAk4fe9f8v5Z5H/5Z\nqLFA9sOXASJrONOc+T+yvmfCj11q61JpI1LWgp+jyLoRVzMJwMTio3dlONSO\nU+a7nWn+BU3jfPHE4R9rKrliCREoxSXxSrpDEbkq1nuBxsEH344OLnBx5L+v\nhumg\r\n=JV/m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDrzyzOdJ7BxbsSoWy5ogK6LoO9gBIdE84NG4QQzAdR1AiEA0zBEzp5sUoy+1KlNNZeZYs/t5DuLVQJwSvAdhL0wi90="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180607231605_1528413523983_0.766064422054427"},"_hasShrinkwrap":false},"0.5.1-extract-packs.20180608084821":{"name":"@atomist/sample-sdm","version":"0.5.1-extract-packs.20180608084821","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/sdm-pack-checkstyle":"https://r.atomist.com/BkHgvwf6DgQ","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"34dd4901c20a883fdf2623230fe3b2d69cf010cf","_id":"@atomist/sample-sdm@0.5.1-extract-packs.20180608084821","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ITMB59gbdSEO+f5EeP5JIpRMY3H01V5IWy1bPIjAauq7BoBUze2Iy6r+RIA/txRAelkstYyQut00/zBdb9zNFA==","shasum":"588d05993b1370fc31f02f6669b65b90f4679f29","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-extract-packs.20180608084821.tgz","fileCount":253,"unpackedSize":448762,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGkOBCRA9TVsSAnZWagAAkHEP/3N+ruufgBQymzxRyEcc\nN8Qoif4x43OmlwXKxcfyauPhad3rp2zpkVvCXpa5OD7bbGf9St5G4OKkTzLV\nfMvBFybkbNUPRKMhw1v109k4x+Hhz4OW14Y5kuUr/lfqwSIWq9COWo+W+Pha\ntfRHkb+lu1PkAzr0EEoPzY48JUSpG52lm7GTYy13zxP5h44TRpE+sT6tytZq\nRSTdD+M2sd49hfCx3QdbKiizkh9s4/SAUX5VxFrjoCmw7TaXzgeiuduhh875\nC1Y3RGLxYoHiom+G17kqCRprJFTXaNGE6Rpu5Adi/Ti9uU9UUDfdCDAiGVum\n5W/HkVWJf4yZFr+OwZ07ONdnxXgXnen/qxXAjc5NzkOtOQcma4brtnkkVo99\nIbHEeWKuIWWU/p8Ne5N5mTZABUDiOaAVBrwVbCDd1EQd2d5lZZHjmzD36vqP\nZcZIOchE/5wXozywnzZw4ZEYJaUsi13RUc1E54DTJOO8Q0vcY2xMPNkDQg7S\nge7LCio977+tk1vdXHJy3iNRYRvE2JOFM6u+j6TYns0ZKszaAYcNOZkZ1A3U\nQ4S7mzgDJ4EtJXElvSZV7+oytB5VqznzcJYfqG7muQpd7LTQ5tu1MVEyDEox\nsWKMU5/grMfLVLrBJwH1Nx2lF1+ZxQ9E+6bTdxWsdOXEkHqShQOX+FvJzlCb\nFcq3\r\n=21Bk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvUVysVJISfrgPQzCaWXZw5ENL2ras+0aHbaVea0/qrAIgFSf8gazuBE3kE60mQS9nHGBpdzFqLoqaUeQqpWRSxD0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-extract-packs.20180608084821_1528447872273_0.9198034618167208"},"_hasShrinkwrap":false},"0.5.1-extract-packs.20180608121712":{"name":"@atomist/sample-sdm","version":"0.5.1-extract-packs.20180608121712","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/sdm-pack-checkstyle":"https://r.atomist.com/BkHgvwf6DgQ","@atomist/sdm-pack-sonarqube":"https://r.atomist.com/HyCOMQg_eX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"2e3d8bac71b1234848c5fe8aa209171e9281ee85","_id":"@atomist/sample-sdm@0.5.1-extract-packs.20180608121712","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-KQnWKS51Bsr2nOMi2sNCcNHYg2TgQAWtnZrwJjuJ/0f4ZMPZTnu/et332GoqKpClK480Td3eeN83oQ+e+LVnNA==","shasum":"8bb769b75a162a259836931f4a0788b67f42bb9c","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-extract-packs.20180608121712.tgz","fileCount":247,"unpackedSize":448049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGnRaCRA9TVsSAnZWagAAMOQP/3tLwA0p7snu7jbr3HoC\n+Wpu9ilfIaVI63wuw+cWwtOnClFEz33e2JbxTAjAAQn7j3cD5Bj8232pXdbB\nrAWA3Wzc4nZyjkfvMqOVwN9vlpddl/7rZfLGYdRcE/xvxpYyNlsHr2w94zo0\nFL2vFgJQJD4bBhJQqLDI4KZSV5isaLAuf7G1tUS1xT8EhqmljFPOzmp8z8aY\n8SJIVb1Ja0dRpgjtcUBlNmOrNfMyMF4Dj8PJjjprxUkD5YpaNYaz0Kh3pobN\ntQdMNmqIybpGATrQfESKDoXVckcV52bx88q38juYA2vGv/518ZzCdrHwCoAj\n8ZHFzBO+eb1v9wzy/uO7vteAr2GpzsLC6ZnKMzy5DZg+PGHbg3uVpMlEoGt9\nq4h2ic6XD/0OjRPsR0gulQsRkCIssu33YaSkLglA+AkNydtBBM6VrGiH/yQX\ng3mVccb4qqptDiX2c+585aM+0/dv4bUj6t2FRTStattlgouvSjdQLBVnv3gf\nCFaaMHZoa0eJkgV0Le6cvYFrUll7QBs16Xlu4CQmugwsnnZIFXRVjEF5DMhC\nUPPJ/Vv5TkZ4/6zP7aS+TiiAYfhtCU0iIruo4yejBkjyiT+ITeYPyeJODVVW\nOxUMBX2Rm9+7D/Il1VIrh8bv1gj6EII/hJ7/DBvEmr8lOVvBEgzMfoaXuGPi\nZN99\r\n=leZ9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvYa+nrLYhIhNFnsLBl8VBwCR6r7lfygTuHKgYaW+RoAIhAM9UDbZM8n/nfgEPZ2GUmKkTy+3LEnvMtjbR2yGAX8O1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-extract-packs.20180608121712_1528460377481_0.09607452219892254"},"_hasShrinkwrap":false},"0.5.1-extract-packs.20180611043815":{"name":"@atomist/sample-sdm","version":"0.5.1-extract-packs.20180611043815","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/sdm-pack-checkstyle":"https://r.atomist.com/BkHgvwf6DgQ","@atomist/sdm-pack-sonarqube":"https://r.atomist.com/BkEhZ1V_lX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7addd8100fe60a2278e204f9f3be96c86cfc4c9b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-extract-packs.20180611043815","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7nbw4KkH/gAEkex8Nlq8Ph8aCDFDQoexVSno//FEPTPtsDlV38TlFlLPVc+2BSvG9gsdjFnHORl4Pt+PAz0VMw==","shasum":"b201ca4000d4f0b02fc90d7f13d25008e9154a4f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-extract-packs.20180611043815.tgz","fileCount":247,"unpackedSize":448049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbHf1SCRA9TVsSAnZWagAAnV8P/2M0trGA6MSVogMHLl9n\nnNvHozc93CGk5FWhasrCiC034uKKRAdqxyCEsmczduDWXVRtXWbB7/y7XD56\nABDKQX9O0K07906j1kfCmHZxYPwl9iJJ2fGRnzFdkfOmn4h9+0BwaU6dYly8\n1jvesJ5enWPYTzqIC1DQdhHsgBzTmwR5/+fzi8dESmhH4wfehwBQsX8+QJnu\nu1+0udeyYQGTi/7GzIMPHRXVD1MrS899JbGk9IeHML2FkKPA+nEptm5jClLT\nHM83YkfbT/JdYNgMU7omXMK1cWnF3sZMxsPKf0JRNJ8iHy0Oodl43KQrRwlc\n4OwBKoq/U2ub3VYApMyqEzRviikmut3qb2Z6CEQt4RIHTlOsusRgBYrDk6u6\n0pub9wlec33fjnUlw55uyfti8DdJhwErdUDNQYMZStWGkRxssA6y2HlifacR\nPmnw0pjaVJ2TkhA/kHJyVgRUsj5sykP3lORP5wFZWOWHPhA8RnqiLVyHBnOo\nZz23F9ScFcoXF1jXb70mv4LE9ZyaBp7Z8AZK5Nmyp/OptLDd0AJr4pA+T1YQ\n+4y5W3MEoxv7+c2R7zBn1H+bae6azg1cmTF239M7QXWhtF2iug+nupMq+HPu\nB9OMDtSzG33F6oJnmi4aKKE8Jx4pUBBMiC0HeJRMGWl1EvMlVWbhxtoeSOxG\nFxw/\r\n=HO3j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjPgszG3rGa8GZl3nSxOHCXIbfJ/FV9wSRrvW8wJeWowIhAMdljff9Bl/C6kyjMia2vymaDJifpfcSImvq4aPw+GMH"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-extract-packs.20180611043815_1528692050079_0.7680321753539252"},"_hasShrinkwrap":false},"0.5.1-spring-packs.20180612193345":{"name":"@atomist/sample-sdm","version":"0.5.1-spring-packs.20180612193345","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/HJV-CGrbYx7","@atomist/sdm":"0.2.2-extract-packs.20180612004641","@atomist/sdm-pack-checkstyle":"0.1.1-spring-pack.20180612184315","@atomist/sdm-pack-sonarqube":"0.1.2-nortissej.spring-pack.20180612184749","@atomist/sdm-pack-spring":"0.1.0-20180612180014","@atomist/sdm-pack-sloc":"0.1.1-nortissej.spring-pack.20180612190449","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92f6f1f0ab39ea250d75e3ff85ca377b82e07fe1","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-spring-packs.20180612193345","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-54B0WiFCYmWLG0O/TRXIHgtX3gG2hzNq6NrjKOumsqKulGapHxVrCXUoXjanbKjELIws/omXsHeYrF3989RlgA==","shasum":"f002ed00f1457a6b79b2f1b070709c1b2246cb03","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-spring-packs.20180612193345.tgz","fileCount":199,"unpackedSize":387365,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbICChCRA9TVsSAnZWagAA+XAP/i5nTEPWoV8ujwf8FGeo\nt95BX7jLg/LHHZk7QO5Wg/O348FDu/xoHk1ynVf8asjGk2FSMn+6UZWs6b7S\niFIJfcLj+qrsSpazzYpvLvg6Vi3kVKKoLS/sdBEmCsLzr1Ygbt80X9DHHUbn\nh2AmK0Tp6gnjDle9yRzGU6fJipQixURhoQM0248pG3JVCRW3P+mKMaE8KT26\neqCeWf2pN5knUA+olIsoun+AS6BnaNhMVR0KD8YZ/42pkDJdWdXmmKTZIfp6\nTKJEXbSjLsZ4dM4BSndA68en6U5IlhxroZ467zBKLV/9mAt5GBjLRBEVf+Rg\nBGDHudW73epKtUtBn0L2U4xvmutX1KUxqikQD4Dqch+NPj5/bCaa8A/hNMdP\npjhz4+ten4j3VE3AimyJjneNx1QJrq8pt2sjDywPBWmsdD18DaZ2uj0+DTMK\nsaWcoJU8e5bAvgvnHVE8u9U+XrEjK+OByAtBiMRRXRvyYxQuYDdXTxtpJj7Y\nyTWxKrvXj4z+dKgkr5KZ+3BqT7qvP8dbvVJDt1Uk4umcq+3pzRBNVwMmI6qV\n+sOdwVsYH3apr3qCdc0xqMPBvkEaa6unaMXGmyH1UO9WqBuirydKfzxY/39r\nex9YLQYpXW3PbMpCIcDSQtWzXL8+005RUpC8Skv9m3YBP1Cc4B/hppMrcYJc\nnzRY\r\n=N+Nd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEjF039HmRLgEqMnKashyk25bMuvfoXIRDZNje10uMNWAiEA5qKsig/mxC0VAj/tfgpgr8GQR+nXq/F4tln/WUoPiBg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-spring-packs.20180612193345_1528832160936_0.14796418402318556"},"_hasShrinkwrap":false},"0.5.1-20180613210753":{"name":"@atomist/sample-sdm","version":"0.5.1-20180613210753","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/HJV-CGrbYx7","@atomist/sdm":"0.2.2-extract-packs.20180612004641","@atomist/sdm-pack-checkstyle":"0.1.1-spring-pack.20180612184315","@atomist/sdm-pack-sonarqube":"0.1.2-nortissej.spring-pack.20180612184749","@atomist/sdm-pack-spring":"0.1.0-20180612180014","@atomist/sdm-pack-sloc":"0.1.1-nortissej.spring-pack.20180612190449","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"36ac24e1e83a221c528e1e74f70b1f3064c90cd1","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180613210753","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7MtG2zef48l6TfPCPULPCRQERbWC2JGH4s/b8l/HAv/qHf7DeYzisbnpOThBVSizJ3zd203jvMrsu6VUZrxj0g==","shasum":"1e06a83816d9bc3905739077b0b13b74d821e7c6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180613210753.tgz","fileCount":199,"unpackedSize":387352,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIYg7CRA9TVsSAnZWagAAi98P/0wp6SaulOm7p51/iqjz\nwW21SuIIbrPDcdpWfJQJiRPJlzrn1hNjo46qAWvjsxlKgelY7ti8aTxVfvW6\nyHi4COahI5vY77XsdrKqreDv7pA3G179Ul7conzQB5dK4wlP375haQzkh3j1\nj0hnfFIBkODyBUG9jWi+6d++N6502nj8IxdOWIjt12/XC4H/sajnLX9ZzDzV\nsG+Ex07jTZ0q0hziZVO6z6TW7i4i4WcFgaefzv8Bb6iqpe57v9bd7YODiQKp\nE35uPvocdxFbeghULatsH6ItEtsw+vONP0OGWphB7QCY4HR11ZMYXNabCJYQ\n2xbWyj++9WaOs1PAruDMLKnrPaRehhKMaCYg2LZb3YLhS4pSnsmHrNzXwtQg\nWN+5rZwUDoYsdd5TVyKwkF2fTVD2QNrJLTtF763+jq8sNmEGNsNPsscMPMI7\n3OkCzTVEnVPKZS4b3WOb8Mzs/8wg9i2kUgCPq3xRfnVP/4nVQAYfDSwADaS4\n+6+B68ccBpyvuFTb4iO/ok9fKYOtuPvGAvOu3OhGcx5LNLXB1TrUIt6LNlGu\nNrtk+BjN1U1LIjY6NvCdNqMwAq97epwvGdTKQBgtv4ZU3EoXnToucFW401dv\nZ+2oJF4ytyWcV4RGCxMoKyQNEJ/edUij3IH4HB+QV/Zh+FAfGLoLAbcdNiZU\nhYLS\r\n=jb1e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEXmqUstkQI4UzUsygT+djmabIqkVgglL6USSV3XrIy2AiAUKVKY28dsmgyDBEn8GzCDvHNB3WnKXRmhbVZQKQiMTw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180613210753_1528924219202_0.6990616233457245"},"_hasShrinkwrap":false},"0.5.1-20180614003635":{"name":"@atomist/sample-sdm","version":"0.5.1-20180614003635","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/HJV-CGrbYx7","@atomist/sdm":"0.2.2-extract-packs.20180612004641","@atomist/sdm-pack-checkstyle":"0.1.1-spring-pack.20180612184315","@atomist/sdm-pack-sloc":"0.1.1-nortissej.spring-pack.20180612190449","@atomist/sdm-pack-sonarqube":"https://r.atomist.com/rkEykdNk-X","@atomist/sdm-pack-spring":"0.1.0-20180612180014","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"fb92184d244b713e5d15b6e222d614f99cff2890","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180614003635","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ak/cmv5oGqRGPpPzmTcyWgJhAazBR1pN4xTCWOzCjDmlFhqzBScQBMZIb7Fxwg55BvH3PPBBvqgVcQkNE66Y6Q==","shasum":"2d42dfe610153bca01e744a3de23c390144d18ee","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180614003635.tgz","fileCount":199,"unpackedSize":387274,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIbkiCRA9TVsSAnZWagAAQUYQAJOPohP9Zt7QEZtRmbCX\nMOGGqUwTw3269epOafkFmB8vGHsZY5FBYD/D2ynpUsRFOvf81WP1hEHCTC9Q\n1L5LHgTazuQKwQfC5LkvfBHM8ODJhfCGL/lH/JrJXhB+7Py0BL0kcTe0VowR\nrlPqcbHU1wSnI8X0P/w1SJsCPLmk/OpKq7nSt5ANs528k8ya3nyEKW4JpD1v\nGpfKXsE2rYV2G8mkD0+Zemm1+lJ6+0jE+XEnStBIRM9lkQ0INUOGnpa0FKJN\nrn7Ap7f8q0KIH81aWA4sgkqjDPUHQu/hRUanHpffPqHTl4wStXPOSqwnCtQR\nyrCeVeQUhXdPp0ylxvPU+98PAP4vluDAMuolpasoDoBrTevhKT/RP/Mf7dFW\nZbmfeORH/UbmvnUEA+w4/Hyl5r6g38ZulwDDtGxF32tEi3Wso2pWXBeOngr0\nfnwPaIhIRv5ko39Lc9PJDLGu6+uuFAA+okttRG0NK4m2ObSYhJq7HuAsSDT+\nl4VhddZjiIoI1IctGBAE3Lx9CKZa9O/N2j6dm0FTHHoRIuGLkzhiHVZIVyb/\nhdrcx6tn8WzrHLRdMvoA3LOZ+LzPApI3QUFdWbjmW0N1AVWguByHIZG5rdo2\nKR0pFrdheRfFcNIrTDM5iDUEo3MQ6w5Pmwr1NfIPf/wCoHhPsva/Zw6Py7Q6\n213b\r\n=CoNw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDa/zWm41gfmn7Go0qi9BicdWPbSzOCBR6D/zmlSTPCbAIgIoA9FED0LmZ9zLOGOThh7ppwLa72NuLpO6SGaKY2xr0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180614003635_1528936737982_0.13200270492907817"},"_hasShrinkwrap":false},"0.5.1-20180614084426":{"name":"@atomist/sample-sdm","version":"0.5.1-20180614084426","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/sdm":"0.2.2-20180614082404","@atomist/sdm-pack-checkstyle":"0.1.1-20180613212018","@atomist/sdm-pack-sloc":"0.1.1-nortissej.spring-pack.20180612190449","@atomist/sdm-pack-sonarqube":"0.1.2-20180614003148","@atomist/sdm-pack-spring":"0.1.0-20180614022607","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"eb3407431296752b192063c465530b399c743b4b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180614084426","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-EFmr1suxULBETqLMH44ZXOeKqQTFbb6ZapQ1HbfmLx9nL1LwHiZYUMPJkTLOXiv4HmOHrjen7MYQkJRAa0z+QQ==","shasum":"188272ab52bbc2d8d162003c7823daed0dca8c92","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180614084426.tgz","fileCount":199,"unpackedSize":386536,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIitkCRA9TVsSAnZWagAAoxcQAIhyWg4mXbzAaBsqDleP\nosZKhGA8mx/xN0bp9TVB+EHK9jdeP6OAJA/rz1mSUz8ezlxtyKZZZbzqv/pu\nFheHP4SIR53UD7vYgqYtrO2nFvHpLO3MR6TRy/tN+/KaI6Zwt+0omH0uQmMl\njfhPUDAtawaa92FHUWpWBJzywBGZMd0KvILb787uSKJ6NTuU2KtSBqWwOtwM\nbYcXWclQ1qtDKqqPZmw1H/aukmmleSMj9VArKuAtv8vnROjFiZxX7zc80OMk\n1KiDzhdIrmmiLQXMXok1m4Ao7V1OEGg+eiZDyvVyyGpjbSXOk+WC1s56S6ps\n4SBRDffNpXRNWoBQ8NDz+zGM5krpnZzvQ6mIz2cJyR2MDAj8AMGCN7xf3RJT\nnP7yfxpbEv7iqf59NaDB/7VO4iXMPKQsp5vq09yIDCIzJzFpoIeWctuPFNeC\niiKaHfx2xyl145mklqKJ4DYoTL6dDDQts3M6UKOolxzTD9htX0ZCLF2N79Y/\ntxylHD4LUg8Hbkbt2FJ7MIwSAE0DC9yVqvlIS1QNUs1yIn/cqTkvyQixVZPR\nFaVm2OMzaVOnHooCTNBai6w+nyTE8Ta2+oASdETEA2x5G5E7s9kL2sdE3FiO\nDu42VyJQ25o+PPEOnLKPAH2Og5ZhBGBMx+fiAU7eZkZgFQXGEed6M7K12949\ngVYh\r\n=iq/6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIErYtviM1DTalprgk5Ci2XbRhMKUVXUKlIGTkIV6WvxnAiEAkLRmn65o2zoY9xEaPGV13VeO14/F+9A01pXqnh5Fb24="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180614084426_1528965988058_0.387910997690631"},"_hasShrinkwrap":false},"0.5.1-nortissej.spring-pack-options.20180615180227":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.spring-pack-options.20180615180227","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/sdm":"0.2.2-20180614082404","@atomist/sdm-pack-checkstyle":"0.1.1-20180613212018","@atomist/sdm-pack-sloc":"0.1.1-nortissej.spring-pack.20180612190449","@atomist/sdm-pack-sonarqube":"0.1.2-20180614003148","@atomist/sdm-pack-spring":"^0.1.1-20180615175610","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"0410ee692b2c16687054f6819e73980c859c2d7f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.spring-pack-options.20180615180227","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ztcpmL4KT4IDN6+i9Z/mdup3h1NGPN74TMW9WjmQyxTCg67ZqDWsSdGj9JGqHnHHMXAfAf8G3uti8eSxU9oHkA==","shasum":"64a8eea2537595ffce9aa5f91bcf13d0bb953a2f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.spring-pack-options.20180615180227.tgz","fileCount":199,"unpackedSize":387361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbI//BCRA9TVsSAnZWagAAPcsQAJMg8t5Heva2rP7f/9nD\nNVqd2ebS8eyKszbRErcD//uk9EkStth3Hw65JmALl22WBC4UN6DYE+rhTqSs\nl9yE3Mbza/BLxws1Cear7J+EC4xSQZvYPY4m1gRgWQ3tfQtl2YJf8As2Epa7\nNKmY1lrDzh4eaJaRDtrqk/r6jCfLrRmVts92kw0nYWFlwxyZYmRoLHi7wz8D\nyPFODeo8zb3s0Pzc8CZ2pswi1kxy+yaSSlzWnWNEEE1eixJFB51wD3TCe2XO\nMpUzpPhJJRXhlABdy9Ba6Nw0cCDxbaXiJ9LFEE5gpnzhNUgCm9DWM83NncwA\nSkjFeyaWJYg0KZXct/EkBFnGP13ie/XBktJE2v9eYPlisVumsgoIbsjea8Rf\nof+/tP3qnH0coyN90FBgGiTV1YlB5u1oRLjxGhsmkp/137hrzGdP9I7YI0sM\nOxBTPYKZBQp+u9PFHDwR8gTWhPJAICI0UxwjBd/9x1zsx7n2QVJOS75RoIrV\n8o5l+VTsqUHUJIYWvmjd0KRLrcDCxGjCVDqVXZSY6YuK1Xyv7BH3HfFiqR8M\np3cx1sfPSmCcqoJJ4elAFhHKJR6/1A3oT193wBvBWh496IlLSjwoRnHG2w7l\nVdfVCj1SmCoLZLrjQMPChmUx6VUv1iMEvpmBzeblbiMyWvuMmprS9NRrvX67\n8oAn\r\n=dL7o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC39sgcvIangbgIBM+kYDtbs4jOxu2pQyPXT0gnPB26CgIhAOSnzFbbs5S6b1edpZtB72VIGN1J+6hNEMAWqheoPLl/"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.spring-pack-options.20180615180227_1529085888488_0.37802306975657407"},"_hasShrinkwrap":false},"0.5.1-nortissej.client-as-peer-everywhere.20180615212857":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.client-as-peer-everywhere.20180615212857","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/sdm":"^0.2.2","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d9a378932044517966f00c5b4870f713e1c1188d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.client-as-peer-everywhere.20180615212857","_npmVersion":"6.1.0","_nodeVersion":"9.11.1","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-i6N0WVu3Kwk3E9mIo/yaf9xVx9g0chtnPMbtoXb4ZvRZsFF7PTL9x/NiT9trPuR3645HyF2SmaE0P1TEBVHzKg==","shasum":"db05a5e0d62a2cfcdeffd661b092b7806f10c724","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.client-as-peer-everywhere.20180615212857.tgz","fileCount":199,"unpackedSize":387274,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJDAlCRA9TVsSAnZWagAAFiUP/0eiVKJPhxaTZ1Dyu09v\nWHTnV5JhKrWe1oqdklc0aih7QgRbprBNy/0Z3AQaLiWXbcSJu9YcMaew82Do\nPKzPJ0JKjr72TdBw7N2VB6H4G/rMpmIuGzx3f9RfwFdFCTpV4/1Ik3y0MiX3\nA/1UPUqmboaBOAX4kbiFO6T1HJAdPqg3JhtOpceMpaZ3bBI5fgI/w2CTEDba\n77PekG79qRteZXj0lisuZTwF+mSRCLL7gtctX5xcjF3vUMazN+vVkMxlpKw9\nE6bBW1RPxYEjNf5d/8WkiIdrSyfD/clJxPnH7PfLBQH5ynvAoWjDwS+UpPmb\n2qzWhafe3oOuskZWke0a7y+oEhrpWvw+Te5p0+UMvRLsyU+oDx/AffWLzyXW\n3kMwZZmbadvF2CS1Z8zb5q1MCjqRHAqMXWkXql/aots8iGX2vKfiqCJJ5RUt\n5RBrkweXs61LuDB1SCJCgxoGfN7Ta9+3bJSXoxaTlR5msEACvohH8LOKY99w\nulaHsneRCs8/zbFYhhZMKuRwtMfmwGRyI71H8WG+L3y1ajze9ytz8Z9m9J68\npunp9OTGmGijEOvQgQ6bGz8qda/aFSus4HvPJlf3xhLZ3pFFEThysxxR5aTo\nTQoHvspirzCXPqS4SriPuYsPBS6ih+CO8NL2W36QRoR8PTWJvXJY1+VT6RRl\nbk4P\r\n=m4Mr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnqHnqw+BcwNUg7gVzykdmGlOxYLhvWw0e+pZRaAL40gIgeYxzfyrrUU97wARHX1oQww0OS/SeMYqqrM5HvizkXWE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.client-as-peer-everywhere.20180615212857_1529098276455_0.15393837156309376"},"_hasShrinkwrap":false},"0.5.1-20180615222231":{"name":"@atomist/sample-sdm","version":"0.5.1-20180615222231","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/sdm":"0.2.2-20180614082404","@atomist/sdm-pack-checkstyle":"0.1.1-20180613212018","@atomist/sdm-pack-sloc":"0.1.1-nortissej.spring-pack.20180612190449","@atomist/sdm-pack-sonarqube":"0.1.2-20180614003148","@atomist/sdm-pack-spring":"0.1.0-20180614022607","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f498d43ac6782ef739d67815673b68e86e999253","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180615222231","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-4kF3/0M7/2mY3oeKg2vyE/T75EaDhxqPDwueV74Rs0O9S+4Eb4Z+72NHrrGJSw8PG4WEn84hUdQ42U8/Sq0U3A==","shasum":"af4132dadb622215481fd050639f24da2b76f063","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180615222231.tgz","fileCount":202,"unpackedSize":388359,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJDyxCRA9TVsSAnZWagAAgFsP/2hbXRMekZm2E6FxcJw/\nVZ28ENXCyf+BLGyf+E9t6CYkJjMuQrwLcielCM6oMgqlXOu7Jl8V14n5DD5c\n2DXWrk2Fg2GtHAl7W9hzRLHLLJ6ME8mMu7uBjVYTwFN5RmExQg9+Gu/sUWXt\nn5fsT2uU5mn2kTIGmSss62IavAfZ4E6Az7YcocNIBMy9MQnu5hNmXAs2aFxK\nf86WycnHuIX4M9wOVkIKuKlGoks33+TRmrFGdEgOqEo167aK3K/hdXLqo+1t\nI6aYGd8Salfex4LLQpMBwVdligAqKgH7Ae/1cwlJ/M6lpr/bsMFkPCjtQbbR\n16qeiI5d95rbsMrOA2Xj5ac8HbMKJPqd0NO6FQU0GKrpHRLAxjd1Yn7FOuNX\nrqRjGgI9tk0t00zNkumZW5o59S41Tr+mIFbTUk82y/rlhRs7XjNSn0mOcszW\nLCSBXb0I5GMc42sOCxfDuz0OGipc9/euyTAmp5tns0puny86L4H7ki9ZGXJB\npQKH94mN4SfT18XmnxzA7+HvUrhqfBoadV6+6GR6xGlUVcqdM9rS1bnj0dTo\nBmI8OGc8c3sGmKV5XP4S9+ukLO+tzvkFxMF4bDROMM6RQwWV6A5uX9OkrGNr\n3s/xBRCsrrSTfIbU19Dz/Qn6pL4adFU2NWEojBW1neMINqKVvX1Czr5bzhVj\njcSi\r\n=mUdW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChMFnph9Nrg454+GHaAzmiA/URSZOImWHKjqqMzxUiTwIgKSnFGAPPz42AP0Db0/PLKPDsgIdx3VEFCtXCXbJa/T4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180615222231_1529101488793_0.9243779104000251"},"_hasShrinkwrap":false},"0.5.1-nortissej.client-as-peer-everywhere.20180615222755":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.client-as-peer-everywhere.20180615222755","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/sdm":"^0.2.2","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"a80a598bee3ebd3f5c4a37f3fdfe705bb493b859","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.client-as-peer-everywhere.20180615222755","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ufRx2tzrX2e3HaaXitfjG6pUb+IEUUPhZduRCZnkpS4u7OYQYQf+Sw8FYzDffuodsdeUKImGWQ4yj8dLKsMn/w==","shasum":"513bbee6876f0b076d68a36d568ffc232e6172cd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.client-as-peer-everywhere.20180615222755.tgz","fileCount":202,"unpackedSize":389039,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJD4NCRA9TVsSAnZWagAAak4P/RjJWnKruvjEGOWdQ1ib\nhF99LMbeWSe/sVAa9BXHeDchgrzSt857aL8O4/9KzELFcPML+KGUNChqTCiC\nmt0FfkavJU7cKt9EC+rIHvF9agxYuat7JIA7ahsQoReYx01KslWYY63dFyFe\nSoCLEdOj09rwx/4UIIhfWjIWIEAUQzk5lSAhBuywkWLWpcCD6N+Ug0/O3dtX\nTfvhXiUGlwGltvhs1TMR7sFJpNhvw226NSniQYwIF4VdDkbuD8kZf32jpS8s\nuLs1ho5/aRPfGgBD+Hmsaj2lxG6tVji4AC5Z64KwDtkM25aoAg9++bfzzh/o\nloSgiRLEkE/EbPG9gPu2U+djCD4gsMcwH5xDoMgv1WBi/Bw1NQQ8fdUWB+G1\n+3/GTX12zHau+KT9HBvvo5+DW/vXrI6XZcLq9H5b7/exPlXmYggOzOvHKcbw\nbUGmMl6uN+pFlkxUzWMnU+F51V0TuZqV4UP8mnBmfSen/mZkL5bttJHVCmV2\naCX86Aq7E9Dr8m5v53x0Psrn0YhQj8Xlstx4jIzDHUKsaGszXMTNpgOyQ6gT\nQD+bbeK4BaQZrFUljWJEgqG2a3dIbzKjvA/Ac+ze5wbLSaI6JkRB0hk/QtW8\nq9nW5hpHRwqalRlMqASLLt5SPTLqy64J7f1A2ILPZN6ej9DONfybb5xOAZel\nOryB\r\n=SNpn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2CGNBsbIzyK2oGVlsX39AD1fCLAyXZ6NoFerLwxKRGgIgPryRNYuJNYrkmN0yDvoxgwUqRDC/P7r9SvG5KzI45vM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.client-as-peer-everywhere.20180615222755_1529101837233_0.7098038111060774"},"_hasShrinkwrap":false},"0.5.1-20180615222850":{"name":"@atomist/sample-sdm","version":"0.5.1-20180615222850","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/sdm":"^0.2.2","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f16e731dac4be878c11e2ec2b6a4160536cc682e","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180615222850","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-J+IWjAhCW5LaBeHl4j0ufsxaeD9DmJ4ymGp6mYazNVzbAX6emSj9G+J1U7t2+TJqmsZLuR9WAgbKNR7Ywm+2lQ==","shasum":"95a1e712a08dab938c6b7b5e5fe90434c3788a82","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180615222850.tgz","fileCount":202,"unpackedSize":389003,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJD4vCRA9TVsSAnZWagAAfTcP/1q2BFuWCv4LDiJI9g6f\nX5HQJ3GYm5XkmERHmVOXhhpZ+lwsaD9p9b2nqakgyQMra8cdirKK92KriaOG\nnotMmamqRspgV2Ltd2F5LTS4lJ9eXBxH+eMbWJeQWsyZQ7Z5wnZcn1Ubrgpk\nVMH7zKIovOQQQtmUnxtrJzWUZDSTXxXZTYQtCkQdXZh7mF54TrurmkbWWe8m\n8tci0tJ7KiE5z9SMTG8+KRRN5u+RFgT1rcDmM6w/K9XYbBJuop1ORrH1tAwP\ncGxjoWFiBb1vxnXKBK+KNfOPYeu9Jua3faqAe466s6NDYw9Cif1oUHPeXPp8\nK5nXQwcr9kKGjQFa4if9sViQjXx7nlP4A62DidUexGMWePgulY4fQ+HFabBP\nG1KgNT5Yb56Kah2eDOGTg4DoCn9UTKF/pzB6LE1F82lcZ0n/20IVF/+MkIb/\nFh5S2/rZp9r0hp9EOxOYIAnN67nIebf+kQc00b0ujRqli8aBIztSc6DuBBKJ\nESjvr5z1TcnkVA9AlTNCUOrxzflV3F0KWUPA/EQ5TrvPIB5ObkEUoyAflaga\n44+srIg4xbq10whIeSMXUUt6q7mofIOQ+ojz3ux6hwToAvQ2tCaDCsmb4cbh\nbI10/amL++UqV9YDGnw6dU0OVujaDxb2LGc5FFgXzoE2Nae0HBUKLOTHRgGl\njg/W\r\n=+2mK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAtyDd24UmBFpX2m1s7vIGHH2uGy+Q+qVkrRtcrKX5YZAiB3wp+jEATmVJfa/W53DdCF7J5j79+VRhPLkNq2xRo3Tg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180615222850_1529101870721_0.5489206327061387"},"_hasShrinkwrap":false},"0.5.1-20180615223344":{"name":"@atomist/sample-sdm","version":"0.5.1-20180615223344","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/automation-client-ext-dashboard":"0.1.0-20180615072636","@atomist/sdm":"^0.2.2","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ecc931befde7497175eb6960ade47716ba223cb8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180615223344","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7LTL1W69JIq3YEqCZPYoxhUA5/kvkyKk73eQYV0nBGfIfQ8Czh7INYuBaXyYayTIWGEtpfkufMsda/eo0zXX1A==","shasum":"cd27f2d91eb0d47ba5c6873a11219f9581a34d78","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180615223344.tgz","fileCount":202,"unpackedSize":389271,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJD9ICRA9TVsSAnZWagAAOm0QAJiAYMpPMp2AcxTwFpE3\nPK4gPzHPjzy5kKhSvIfopCEhExrwmK9Hxg7aIy0imxUxJFD/zdQ9sIn0BBNj\nk4jotPA8S8AL6IEZcaM2I1IxqAVZlT+YOu/eWykhr6zHs8vSSWVOtn3D3bTr\n+WfZZWzqRCDgijrr1nCS+54KkIxztTA9JVho4LZjOS7s7MysTjLxbv5co4p9\nI477HwWuBmwPsiBujdlAM6yem1Yq70XS6JYGOIaDpf9hCLOgSTu1dFI3wEu6\nHcGp55Mx4yHkyi0WPQKqrsfmjI++Lb7l+iE5l0OAa1fiaKPC2wfCFdjIHXbI\nMSIz/UPWYy77Ru2r3dxVXUzODQL9QxrautqgDNkVRNgaB63Y0f64BInY1i5J\nSyOnYjEIxgP4VQwbPgwG4Dq447sL6JReji1ZdDclj3rxwVaxK3dL/G6nUNWI\nZbkdu4o3R0qU6UZQ2Ggax4AoynEMKPxlYBhEGQuNMvs7nuu3bt3ura3FFVRj\nYraxcKKZS8e3dVfSzLW1ULNsZaRJuOgiAPC5pjLLwPMIM1LYMcQGdRnGyP7w\nWiK2+Zty2X/l+ZnDu9ApN87596Mlgo1NQbUTSkL3sjHDAwA3Syw6APla+Uxk\nfExkrpOQXwK8zGDYXLJGnCaD4RhPeg8bpyaoqFVN6YrOhKKbGeilFOIhmMhQ\nNCmU\r\n=gPZY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCaXtaU219DRZeQVvFWq912cBr31T8e52LCNS7yb1KN3wIgA7cGskekjgBolAmUf6Xt+UFXl0eOuqBTAjmz8OzmbnA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180615223344_1529102152047_0.9642490974805049"},"_hasShrinkwrap":false},"0.5.1-20180618203300":{"name":"@atomist/sample-sdm","version":"0.5.1-20180618203300","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.2","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"949e9dd8bbbf16ae8d674e3bb915381303962ce2","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180618203300","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-VO5GtexurOin6nuL8N04TIGbu/oY4uZLyqjDdEaepQESy9a7bdBooU2RlIy4kiAIE4XbFiu6nIqGHYHkWhzuOQ==","shasum":"d527b82f5af59b9d8e05bc48bf6a8b9048a8564f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180618203300.tgz","fileCount":203,"unpackedSize":510025,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKBecCRA9TVsSAnZWagAAp9kQAKEv3wlgxi+12EW9c3YK\nqU/8HJBpuV4Rl7RTvlVMcL1JqCWY+yk8Hw1U4bvUWpQxzY/CdhHLkrnlTU+h\nuUBOraMe4fQUQpdL463JKS0RSWqyuQ+CsuxdKHIfEd93n3zZkIvoRhnhAIja\nupqWUUtcReKdS3D41DEE5yBttGS107a+xf0JUsTYOiv9ZCOmGWKR3on0VU+H\n8toGlHFvy40pzblui5U13jgE6M4iTj9ATi7EyHAkd0x2neh5Uhakp5TV84U1\n7nkjQKYZeOJ0E+ibkvdfAJKWRAlupjrAia6fjEQJP1boes4MzSI3s10gt3Rr\nlQDW2krqHJ69/cUyAVxTmkI3VQzGu1SlErnDy9L9Cymg9c0YjtzHmUHIsd5B\n0mUG39DBJJLjMKBi9DuPljNM5V50U1BYW/BlDV1zTuWHs1nanIV9ZJYQ9bCb\nbzjF6eV2y/7ZQdtaxsR+2GgjAnI3gNXdIw9Hm3y3JIBuL0EL3U5msDJjosJQ\nN7La1uT7igUr9KWxTTwPqT6G8fUWl6M3WjQEoJle0xcVtZS5fz1zWvwCFeQa\n3K5DM0IEsAfy519QkVbWoTdbZg3+0cgZWZ2GkcY86H8PFh09iWRLcsYNqddH\n/7SOfQmNjDQzfnfbOniOIQH0vFrWx0EgBTjeTLVVl4RH/kJYTfTcGq7mUnMo\nnMWN\r\n=GEQp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBtYCdDYAMz0WkfMwnTMbbt/jYpOa5gfJWO7v7ZsPf3gIhANUtkmWXW9MOjvm24uKszNDamL3o66WzXvnZAaYGMV7c"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180618203300_1529354139684_0.6703834822278785"},"_hasShrinkwrap":false},"0.5.1-20180619142458":{"name":"@atomist/sample-sdm","version":"0.5.1-20180619142458","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.2-20180613153815","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.2","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f4e896877eb085f8c9a2cc44dce2a86297705bf0","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180619142458","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-hlPerpDbTal2T4Q1qJLfjXPUtvPCb2VYS2pYHVO5FCxBuuf3dCpm0uNKflHs8mPDv8qei/KbFFwZUSeZrXYgEA==","shasum":"d990cd2e0c6a6bf4d7908ed2ac0ee5f2298b4141","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180619142458.tgz","fileCount":203,"unpackedSize":510251,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKRLMCRA9TVsSAnZWagAA1V0P/3KOiJK5JyI0kLvo7amH\n+Y6/ZvPtSBjC9OqCRIBudPpzqJ45wZa66vrzilN6Q71H4a1lxKuxP94nk0lc\nFBBKacrXK6EurESai/PRdrUj3WVxBwKo/p7rlB0+n0exIMLefgg2O9jiz35o\nALwOz7BOymx0LS+AmAygF99erXbHDB0qasTbAdcoPu5kCTAj60WrqkioALns\nVAbPFXDddRzr3HDugSvfPK0zF7vi3CBHwVKceVQPQi3E/d5Tm5w73v7CJXYs\nwrvXrgT3LqQsKw7i/FPEgPQhbYVCA7W2xPx+2scILAYGTgAD9LWoiiAasl3j\nZcX2/nJLs9t04CIejAoQ1mJKdSKz7ZvbO9oQPZM9AUkRO+1RBRjU62982bHC\nLgVg0IAtcYg+L18sBrvh4mlDORsMPCkwm/FgYnxbYjCxQKOtLcuoayVqj477\nidNt7c/h8g11WTEgmi8zi6yrNciNTF0f0JdPGj2DW+p7tHvBWTnjhWy4lqKX\nNKL0l49jiFZADPnVp9Yy43+G/0/OpeqO64LY3n4C6lT0Pqw36G53ym2Rrovz\nMKMRvbPXGALoQstcTL+pG0eR7z1Biw+2n0nhveg1x3T4W4pDRCousjQTTCon\nSLaMVsEQC9CuA58ZRAAaozKb0yi5ajQPpChWWVDIa95MqIcSGUmOaqIMSz80\ng+dC\r\n=4fu9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQhPHHJYIqRwqRmRAxpTqCYFNcKTe1++ALEXWxm7FgfQIgO0HBFA5YtgG++P6EG4DldmhgaWsU3i8Ns86d59liGCA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180619142458_1529418444080_0.3931517823453792"},"_hasShrinkwrap":false},"0.5.1-20180619215608":{"name":"@atomist/sample-sdm","version":"0.5.1-20180619215608","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.3-nortissej.bb-curl-or-axios.20180619000533","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.2","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7db9ca7ea756ec4df1b264fc74f133732c2247bd","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180619215608","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-PTggGhJwpBpOClY9yW9uADCavweTw0RzeQzWl/UAEKTyJQtUBdKa8B1eG9u4Oz34+1vL/MzBvpqklNpR9fKW/A==","shasum":"836fdf49a0223a821036bca87c21681cafff5b59","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180619215608.tgz","fileCount":203,"unpackedSize":510439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKXySCRA9TVsSAnZWagAA9KQP/3Y0LyY3zC5smBe/K70T\nMAnjmfOungfEofGEQjtghoTkrEBaWjeSm/w0wo2jibRNvZZlUXPJbBA8dLjY\nRKM52bEBVBelIpwdSnpcsZ7ZdSxOWpp/+NOXJkZMACYoQ42oLgtA4/yig0FM\n3rLUVTdLwLWeGExOzL5iTWZwJj/KLKwDOgQFY3M5gP2qeQasvrZxDo9Ve1Jt\nz5E+Hu9hClT3Phdtlrg8f5joAR8h5i92ATd8RjwUIxT4FRDxgMyyAY12OK4t\nc91TQ6Mg2jrT5zIJpIXGllkCdMrvLzuyo7SKuZ7ouhc5pbRU2YJ9zWx1+hSC\nnugvJxIW5ZmGnESUh6K+KpgddMsxwbctu9AXbTvkYA1RrXNAD3liSIHwgWb5\n2+3RUVR5h276K79s30NJoMs2nCAcZAOGISf3suqp+dJ2xACB3lJuQhdBM50M\neOabvyE9Q6gHhRZHF+wGyDaJi6QAWbFV6ho0XwyCENvCj1echJWyHlVd1Xjo\nSgR+jb4FVdO8WAXvAUxgRST1UihePuGVzqDB73W4ojOoGU7RomUs253wzPh7\ngsYcXJJCUSe3E2aJy7M1xtgDsipB1pJ26JO1vvyTqP5+T3SKOIYnkd99F7pH\nB+PMRlw5ARgFGaY137C8pL2adwP014CazHbElidtFW4uvfZFG4RmtDxnBPUW\nBVZE\r\n=fU/B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnKx/UUPCKGCjtmVb6Vh+GN2zZePlS03a7Q6xQPwSsxwIgBMdI4dHyZfarM9AulKeAm+UD5lZ6s7irAH6+8/J6kJs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180619215608_1529445522129_0.8063236335653161"},"_hasShrinkwrap":false},"0.5.1-20180620025819":{"name":"@atomist/sample-sdm","version":"0.5.1-20180620025819","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.3-nortissej.custom-seed.20180619234931","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.3-nortissej.custom-seed.20180620001059","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"8d15edf8cba0b3102fcb45f4e2e09a200ab4fec2","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180620025819","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-39UKZ/lTKX5UtxSHEp2rMZ3s/o4hik2MjsLB4G4zh32yuwp9ssG2BQluHdP2itHnrvloIyAb4ZZnUcuuLsR3zg==","shasum":"74cd2bde84b7baf2834b3e3dc4e2f1ba99dac519","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180620025819.tgz","fileCount":203,"unpackedSize":510657,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKcNiCRA9TVsSAnZWagAAN7oP/1wZbgB2BNE0I6JyDkmR\nnlboAjpMaDL4bSpPn8Kgr6KMu3D1pZ5myx9ZE6o4exm7G23ySur75VLq5bC1\nD7vCnHWruF7I0DzlgJ7d+Zx7hjSqkOmBrLvJ4Z9NKtvxfrLteE23GFrtdFbH\nvnZviVjGrQjXunIZ/1mQi6DcgXGbrN6zCXPKAlGqkDEF3eDueCxbunEOX4c7\nzuvx3nrZt6+NnjkBS2LYyyKmXINPMdjQ19Dx1TBvjb9GMU6hIsj1puWLzD8Y\nt1RoCYdJ+KOllIMy6NXlfMqb1Z0AgbHvzOexBfRvWNGT4u3FxY5A1RN+MISb\njG9TUd1+zH95l4AyYv+6W81ywQtKNDIF2HVVZH16Z5qQ/0AA0BWK4FvWzWhI\nwVOuMKZezKpmJZnEjSwgWvQLIforXb7bhfpPAKektbwIwovSHlqrUQHzTVKQ\n4q97tgkOoRw9O4xL1/vq/zEezTaRGv4OLwuXNE/zFWeu7PFMnzi3e5TWjYdy\n1n7W+CzVrI6gPbwpOZ6hwW+Lws3i0yqB1XyX8YZoAw4z+MJTfZaafGP8NZRK\nahOxMv5MIE0TwaRy5iRXLjsc+8ULGIOD9XEEk3zpQmDfdGE3UsoMJbWMGugV\nep+lodm67NKWZjnhpY9We31nuFEg5eYaZ1Wy6VYxmkTfNrlciM8VYQuSVh+b\nms4w\r\n=YdIr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAeg8lqAQhdyddjNO3me3FFOg/c4mIPwaN4UNmKi0Mr6AiAi6LeFsJr52H7+tNMlgDtucg5GJef9WnWyXDWQAN6BGA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180620025819_1529463649610_0.527166146026095"},"_hasShrinkwrap":false},"0.5.1-20180620032521":{"name":"@atomist/sample-sdm","version":"0.5.1-20180620032521","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.3","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d89134edf7dec0cda1d27dfdfb21578f58561cec","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180620032521","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-9I2Iw1q/KcoafcLnVBQgIQ2PXKKaiYBdm/yqkd+FYlsBbxfHpGV9DoyOFA2FGUGjPjK+e52/74N/X/4H0kn1Nw==","shasum":"e19adf06911a52ff9371fd0cd3ea8faf78e7e6f0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180620032521.tgz","fileCount":203,"unpackedSize":510509,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKcmrCRA9TVsSAnZWagAAvPsP/2G9MjSy5Y4QHu/NmkbT\nTUs4QvInSXraK61GztRcvkE/frw3LbU0GPF0MXUbxIGwrwPnUW9Jo9k3D+wb\nmD6328dOGmVXF50uhWgShMM96vqjwwdStdKVJ7ubqFgj8G7077CqgkL+DD4P\nfHOt0afoWvWR/Sk3FcItqhBiaEtGtkzhTTkeoItyc7ZgwckO+5i5W33sCqaN\na5CsbYbCp6WpUsicVmkXmxK1eJ6JmkY8ARq5fC0oqgfcUFsJLijRi/k9s2ZG\nj4uJyzZamFZS/NiCYrkDcBac5+vmr4YEcQdSJmVFmyL37XD8MldP9MHL3TD2\njy1ja1AQ+6ECG3q4KtLGQ+NmqVkrjNqdQdYcJuLtOjcVOb2Yy0yVsZLRYZEh\niiFzrtQj3+880/dhhU4Dsqjq4vkDFhrytZTLsl+DHPLetLdR1ZyH26FndGVV\nHCxOsfHfhLTKem5mYsqRkAkDhXako9RIpj5NycHkEzrnkq07B5CtdEa6fwtB\nwKFzxr7vBOpXF4W1MaTdIt1NPMLBXvCepYalW3uAR/Zek6szi5NHdq7pQee0\nzezDgGokCkDp9MYGGwPkEppTRif6l6hTpVCGRXfCRJvkJWO7f0HrD8d2wpy0\nmGTGb/UT/QoDqNk8U/sqs0MGRsZx2mDc794eA30fGN/iiiumDAF3PnhAXrA/\nbhqd\r\n=tbRV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHDMdary4x+qe6kH/JzVOHUTVKF9zB6HZLsFYTOy4vyiAiEAnKmu4Nsm4vxTLPYiSuHqAsR/Vht8kv7+W2xZL2C023Y="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180620032521_1529465258973_0.2579067184129338"},"_hasShrinkwrap":false},"0.5.1-20180620131215":{"name":"@atomist/sample-sdm","version":"0.5.1-20180620131215","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.3","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"dd01e5c0b7a14465abf02fb5e4a5014d7f51bd28","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180620131215","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-L3uoRFIRvSjwUOC9hgG07c3nDHIDnTD05UpTJ9q/ANaZ/KXLmRmulzO7DzZtKIP9D13Dt71Ium5ul4CmgirASA==","shasum":"932efdae7cd3ba61bf62d14d33eb357dbc257eab","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180620131215.tgz","fileCount":206,"unpackedSize":685053,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKlNgCRA9TVsSAnZWagAAuCAP/ilA3xbIRlunVeAxgcOY\n4y92kP45axiaUv+JXVDzV1YqSSg0m48PaTKhKy4xdTdQMgHku5OAYcK0Is4N\nYZrK86g/YsS9ToO7LMFys94OuedpYFYhmdSIebbaZzWW03IZjXQC+lJmMi2w\nVk7Kaw1YMlpkswhgXlpLk7/LJiwxougMvYEjhLB9WAdFVfh/xcHWm0Eo8MIp\n6aJ9UyN10YPB5MCLiZKqEK367xAB+q2Q2JyQ7U9/o0rL85oM14vcb4Wp3eT6\nGrZYnZT/N/1ZcBy+0169iTUrTXKmnFC4C+Zjh4DCWj85zLA5wYv2bfYo9OnU\n44ZNdw4jVASqdCnYelJvWFIQQFB2V/pGdzzwEJZ2Yq148M8sXcfCmv6gJROa\nLDEbjsdThKNPY8wi+8DEIyZcDZ3zCB9BcaFOv3wtdKZB1sqqAVUotfx/AiEL\nRss6EIttEUBiOGS3xBcV+UftSTMV/iD/XcJSeSHW7sq83TbemQvAtDGcppSD\n9FNHg/elLLeADoklkoLk9K6fSIiklzhBwoslBSropO6kjG9iRvgfr7501TXx\nt9GAQaCfB6G0rAgqYEtOro4gB0b4EhypxV4/PKFRqR6Mp68ZheVfyB19B39j\n/Iti6hA2gVlRu4RwqWU8fh4aqjdNirpvhMzIVYfF5HSB3I990V94pTQDseTJ\nLe9e\r\n=DKFe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMRgSk/FfEe+rHtsDIADt6pg6Qkfvi2FJIIvp5j22aawIgfS36bDURlXx0R6ePhpIDFJhaRGUyzYdScgV/Epnyj/U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180620131215_1529500512113_0.1328266763604431"},"_hasShrinkwrap":false},"0.5.1-20180620142952":{"name":"@atomist/sample-sdm","version":"0.5.1-20180620142952","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180618202825","@atomist/sdm":"^0.2.3","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e6c820e5ffa61830e2ec1d99d5e1b050c74f4ac3","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180620142952","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-5ie2myRS2oUIxHTHtuEHjwC1oskYQbm7Tzzm77ZMX2BQP2eB1K2LHzSMSdavizFZTnwDcmKDtZ0EiveM0pZSKw==","shasum":"94ce369db7ffa751f92a5c441b4737e09111be01","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180620142952.tgz","fileCount":209,"unpackedSize":690165,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKmV1CRA9TVsSAnZWagAAaIsP/0eJzQjCUKi6Bl5wihu7\nbKzI5I5lX4gbNPfWG+CWL853Rp9UDbhatw15nbwlTEqpAsc0ETZdl++wCUa7\nNBHzPyPXGcwYwYV8uFoc5GvZmEpd3mZctCq0i2eBP6XxXmfxh7K+l2TKT3JI\n16YzefRoxttGB2afWOlCj5Jmv61Z38+tLlVp7S3JONPYApxfSgrItkeVaJEv\n9LbsUP3nZirqMaHMNRZulo3+XPRc6uRrj9zxWpZ3Z4ekB1DAm33JK0gxte1M\neqSlju5jA6qkjNyD3ic6DL0Yro295RQxorsxxjpxJQvAWoE7hxXApkd0azEM\nEjNgzewzy2jcFmI/xxFgKoQ0NFqH1AlKyJYIWC4xF5DGclkAsZiMTvCDo5Ud\n8atrYuZr03qguVboXce+2JPEWGjCxq+ukkeKZ6rv3QHdP1CGetImkZZF70cO\n0afNQuRBiMv5eAt89QwyqaDkvrPp301OrCx+TxS6nAOkYfOn3jt3+1VuoFiE\nYlYzSwjeN0YjGV3QSgAWcs1SbTH/4GRtMsmNP5Z+NHQthX2GqNVeSy+VsUPu\nCOFjDREEGYE0AJ07IfWOqEqfMnxB49YGrQLkjAxDZf70HpvaYbO68YDVdOMm\nesr7nqVj3KqdwYb9EdVE1Hkq8DJiYY/I1Z/AXDG9XAd571rMh9j2S4bZPnSu\nvYTu\r\n=0B2y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF085LqQPF94EH+v5Xdv1+KLEHXM9eFNOtswmFyds0AxAiAQT2FbRkWPmcap8D/vheFrlmORUpF+dyM6c8ApGh72yQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180620142952_1529505141172_0.2903189123412462"},"_hasShrinkwrap":false},"0.5.1-20180620191756":{"name":"@atomist/sample-sdm","version":"0.5.1-20180620191756","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"^0.2.3","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"^0.1.2","@atomist/sdm-pack-spring":"^0.1.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"21b27e0773950fb92ddfeeb302dffba9a0548119","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180620191756","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-jDo61DqcvTlZcEyFFLANu50vnOp5U8wWh7hZPiFJqogZj01yryOj6DU//eIeFL1ESQ2yxQV0BWaGEb3aYJcQDQ==","shasum":"1c285fb1ffa24d8b6d615424b4f66aea4f0a1933","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180620191756.tgz","fileCount":209,"unpackedSize":690165,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKqjtCRA9TVsSAnZWagAAiTgP/1AdXnLgflF5PdD9wyIC\nzTsM+qtusldx5QmIjf2dMGIkecLnolqngaL2kH3ZnmKORLB/amPa60kfvyKK\nY6FNMLjpTa2AK2uyC7FOb5ofdTdn3tu7FFlBkFA9e0GO2UlZEQqb8wFbVc7X\n/UNZKURUrkmX6xajicm4fRVOAaLfqAzhipPjWq/5OrEo93Tnm77PxZIVwo0b\nr8O/VHzy491XKmsSe3Wws29yo4DYvRsCojSahG3v+WOfnGexLxqP7o15VrgS\nwaYWbeIeaSa2ElnWRMEJmB9NI+DuJpbydLn44q0//czoWABiko/7DVFjzcA4\n38EdFWphMRcrXzjd0M3hjgaET9Bf8hCDkAJMYoAafXq8CeNjgWlpCRdyT2wZ\na5wq5bS+QFUCphFJOpw2V8zZ9s3wN6qPrfQ2se8OgKl+avgK0sgu79WBylrs\n9k4gtvWDL8wPVjaasi2MBQ2Csx0VqBLPaM9gKjfkrDK+wdChTQ69J4SBFgzR\njM4Y+OB22TvkVlLuJMKuehTXfM1g5lYLjeEQs7vDOPPvZBXWL2spJRvwktIq\ncPUC3hljGy+G+bXIgZEbfNzJsGXFxheRWXv6lfuheq0jrQHuKxx8PxqsO5Bd\nsVuJQP02bc0cPHSLujEYDu/7xKlIsEs41ZqMeSYHaKLtiuvvah0GmezMQMuU\nM91e\r\n=l6oz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFi7Q9AGox7bUsZq0rtzf98cJ6Dv42wgbM1cPxhWUYjAIgQgfTLzwNHV9Qmd1o0C6Yyo6MbFBA6FN7i2orkWLF8dg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180620191756_1529522412690_0.5012118336769198"},"_hasShrinkwrap":false},"0.5.1-nortissej.break-out-api.20180622202733":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.break-out-api.20180622202733","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180622000216","@atomist/sdm-pack-checkstyle":"^0.1.1","@atomist/sdm-pack-sloc":"^0.1.1","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180622143726","@atomist/sdm-pack-spring":"0.1.3-nortissej.break-out-api.20180622131040","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180622172537"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"2a1b75cff8561ccc3a25894e054c07039865d14a","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.break-out-api.20180622202733","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZYjrB4JEZB+zuh+9XkpIz7CuSElCpkV1A9YjR44MWuxFZfZezKmOpP1cokdzrLJ1PZm0sDUt1U2Fzdu05owr+g==","shasum":"8ae440f4e6908a573f4e51ead4327a11f28a9c3b","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.break-out-api.20180622202733.tgz","fileCount":209,"unpackedSize":686741,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbLVyHCRA9TVsSAnZWagAAbOUP/1WWqMSWPfWTgeypQGwZ\nA5wYGYcBBwakGltlUu5ZVBu0GTuatJSF1TVr/mJZEiPEiUrsjW3VxtNTpjwc\n6TYx1Xu5B0VIcQidD6tpqxsuZbsZ8NObZe3HsXD2y9Pg9rwQ7oMVdRLG9Gpe\nUYFwVQ7xmgLQOVTgKDhebZ87r4hKwyFGWj/Mi9xaumdFKKIqnki2y16lbKzN\nZXUcJVQjKLPNBZvto3HysIqgjhr/GzkZ6fBUASy7SC8xfekakNRM1VmDrKtb\nCVsM3H92sj0u9flxvmheItSu7565BxFi4ef+pT6O5pGe6g0K56SQIgy17kZf\nyA8oUuQD+psPJXdhBMiW55QXV0FPA5q6LAnLHmkQZrdH0hL9u24R95bKXI6M\nFT/4GBdcpSSFOIwDiPmoTzgjKtULUkR5cp/0Hfgbdi9xXWdbVs2IyXYYkach\nFmmdubW8Xea5JYQHaEGGXwzw/TZnAluvqGZea4Yb/USdKcnHjZedbLjRsMiu\nyshTVwCFBPG2ZA8PGi/JGVqBwpgcfqXY0vS8dvKB357Cz2n3W9DaBnLY6NL5\nlRysN3Ba4qPClzmnadmIZIquNd2VQwj81ctuuwtgubKpnDp2eVSUpepiG4j2\nrVTA/gro7kESfXE1zRmOZcMGJYSYSghGykrjruAESErZOgmIxsp5rJ1fRoIG\nM5nR\r\n=vIki\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFB3abSBpHcwgIg6+3g0kttK2hJT8pbAntvhUemYf1ZwIhALlvhn4y5n8B+qc2+u1WGkmxW1e/yYVTZewrvBKWy9qD"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.break-out-api.20180622202733_1529699463135_0.739984054198487"},"_hasShrinkwrap":false},"0.5.1-nortissej.break-out-api.20180622220509":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.break-out-api.20180622220509","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180622000216","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180622210947","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180622210850","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180622211043","@atomist/sdm-pack-spring":"0.1.3-nortissej.break-out-api.20180622131040","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180622172537"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"de39b7e00c71078b7415645232ae4716beadb6b0","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.break-out-api.20180622220509","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-EmXQu62Z5WTVG40KHeCKkaSZs0FQG2B4bGzdJVHJ2D/ksUbwMx/99In6JFBNaknZ+MjcbCYF6/N3UvIYzUxgng==","shasum":"5b47e1bb55fa330178cdcabff8010c6a873762bf","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.break-out-api.20180622220509.tgz","fileCount":209,"unpackedSize":686895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbLXMiCRA9TVsSAnZWagAAuMgP/Au6OfLQ1HfiLK7cXclE\nFheMyILcoB+kN7zRjGWipVKSuQ8MjZl30XhygbmqosG3a6iygGF1wspgZCZt\nZyCVGJRoolprr1iUewIFER/EiE87I1c1KbIm2CZ46uHFb0LD8Ewdjq9vYHXd\nhu9b+q5LNYfjuiARoLYil7LcAzieCD2B5iExT5jOIzHHTgfIQLhLX35mA2eM\nREqXn7DXwY56cgvtV5mDZRDTCoMKd/VCu+O6w46cxyyUbK6qOI9+Fko4yDOD\n2viS34ceUJhmPkvhBKViamG72AxzHDX51a3EUNpIrGFdsQ/shkLDwBdCEPJG\n+nsM2Ufhml2iZXcxNfvdF6X4ELF6kCGLyz2E1ImFU9f1wq03y3rkHLwri554\nM65N9n4HfWvkpB4MYQY7Jt71bFRbr7C4HIvURUDrHJ0Qv3ris+gQNvG8auyy\nMajGzLVDsINH3OfNVhM/aAgkzCI/WXKy21n2erRumHmjQkMvDaHaegzjZOCM\ne/KDnciATYUYg5k3RJQcK2OFRB2JfJsdCPPqcW8xNMkI5mjrnMth9wL8Aonp\nZykHz+/xhrr8H63faWVrlH69UfCLfCfLPA424HBKVaJkXsBco3g92vAmuAoo\nkCF8gZUjGOk2VwMFU/H4suKsRmafrP2paUZ+UsHPeBMzLPvF7H/OSX1Tse6l\nxUck\r\n=nsB/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3mL+avC7kz+XuG1/oDbuDCR1hTiJ3T6+Aga1UbrKfJQIgZrTZCIx+GhsX4nMiHbbGGppv9FGohjCd9jIJsbmPGB0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.break-out-api.20180622220509_1529705250013_0.15982923551713557"},"_hasShrinkwrap":false},"0.5.1-nortissej.break-out-api.20180624184158":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.break-out-api.20180624184158","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180624172126","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624181414","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180624181555","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624181437","@atomist/sdm-pack-spring":"0.1.3-nortissej.break-out-api.20180624181606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180622235515"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"abbee7e035019d98c24c59d934583dfe99a9d368","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.break-out-api.20180624184158","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-+6pdx6bVu3YFZP/F3RDdLldgS8NuRLGQP2SsPKVLHDRJNSiN8KvbP6+8pdawe1kdub/XJhixwk3aDoTbILSi2A==","shasum":"79517f1f54a193a2b37d6f5126c45ca59c99cc75","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.break-out-api.20180624184158.tgz","fileCount":209,"unpackedSize":686895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbL+Z6CRA9TVsSAnZWagAAw6UP/2kec6cL3UfcmDE4Ypwg\nyXU+8edpwSDfa5yc3liwh2HGs8/cogfYDfxg13QoXwPlK9u+oqOw1YS7uPCF\n4DrBsCUGGZsN6QMKLAXGZ+OR7q3C9GH12YXYvlFYKD9Al3sOhCjGpvELepfh\n9Rwl0Eb8GRM4FeDwXNDMUJyiyCDtWKiWE64DSnT9tjhCM1qzCxQGf8wI795i\nN8S2yLhOBCLnzfZHFrSNwzTlPJy3v7l8P52ZlZI/svrQIOgcJi+HNwISBKnV\nZDs6ppCUn4tKsG9341i+eHaOubItUJaAcvs+SGg/CW4oTuK/5UfIt5KEXd77\nuYwFeudaFHXjmM6bq3pCBK3HubJnJY7ZytMq2m8NM3+BDYExi8GyV1l5VkBq\nCrF5TnUHyYeYGbj6Sq0CIeJIGiZS8sHBRnocdur6LxyNUtMnp/AAUvulMWUS\nf1JShoOM6vP7bPlD8sJIv1P3QexL7rbIzo4Z0t7eH5z+20rXedfhXzvJEs2L\n/o+i6hDaLy0JBv2L7j+xUq+mOc8YRdqT9Fqn66zm31H7Gw1/ViPKwJQ58ctD\nPp7dXZt1btZpi3j7n3TEtEdFRwgRntNmjJEzEgyeMkuHhasfzj5zpmG2Mvc6\nZQO50XfZ6o18m/9cBHZEVusaD35SeqygJV3MyOxdijcQkaeEuMv6SSoYqtJv\nPD2O\r\n=tY60\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG090h/eDW1ttWXB1LFZLQNLFpL6pM/QR1BCrqEZJ4JiAiEAkokEmgA6xoTCOgbiTl7b0ZRVGH72aI+jmR+8vjTgLrE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.break-out-api.20180624184158_1529865850537_0.5926945737932463"},"_hasShrinkwrap":false},"0.5.1-nortissej.break-out-api.20180624185252":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.break-out-api.20180624185252","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180624172126","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624183024","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180624183145","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624183205","@atomist/sdm-pack-spring":"0.1.4-nortissej.break-out-api.20180624183303","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180622235515"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ff63da229e61e66f414b2928b4b6ff7ddbbe57b7","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.break-out-api.20180624185252","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-QgvbyuUzoO3PoduwTAnvRh3inPRSL0MHk4vg4LN5HLYkMUy/a0PnfX8/UnjnKf16+R1lmRtX6xLZitNtcQ9zjQ==","shasum":"84b5ec28be4c0e061357f1650025f448329c831c","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.break-out-api.20180624185252.tgz","fileCount":209,"unpackedSize":686895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbL+kHCRA9TVsSAnZWagAAD/cP+QFBgYk58HRnTc4uXBTy\nVtNV6fYND88Y/XOfrorLIa2W9J3gEIKMvgwWDvsyGPVVphZ8Js1JBSmyK9QG\nbfoIY/NiWmdKk0hSNxMdsYCi3S/uUMLGYdb6UGAgPTqOp3OQCBfeUxsbvC2Q\n/yIShTZWrKK/lVPGldh1DX6XncCXoMBYjgNSGVbI5B1+pm7GSFZDU7bIPPD2\nkIq2FV7AC6IQ3Tf+sQ08CHmYVZdWFWo8/LQt5PX1nQOqBclyX5/hxfoI1Uvx\nsolRt9Tzd5f/txaRqeW23pieEQ+/25QS3NeLsvvTK31+zhXMIYSF36i5jyFS\nR1ynrFnub8oarw8IXuxXuFc0iHYyRAqXi7iu5tGILnJC2k6izDcjPjRHPPAK\nlglsUvTBugrQI7FNWISRBXEBpqzPxQnE3UXnO9CKgP6xDi/VpVWfCvxclk12\nhnriSrC3nkN7O7vH77ifmAbn7EY+H2Tj7LuZ5zfnKo1Ifvmg2ME3NxSPTLCa\nammKFR+TB+czJFd3sHPXHRtK8kiIwd1TIuPSljg7GvdqO9Cuo40CebzedHBV\nWeFJGgXwzdl8GamF1EiepgaNpOZp4vV7fuPiNhd46W50cUFm4w63hedvTfKG\nCmMAnI4a5GN5yOJqjb4bOz9HOMZRLJUeEkfqN3Y1A7RS0XjXJvTce96iy8Yu\nFoRM\r\n=PgG4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID7vaZ9Bl8Fk2RA+yu8yV+Wv9ezUdJSHbaWzfBrVLp0WAiEAoPZLbvm/iN3Ij/WvqstIReycHK2F1tqLVz9H09PaeH4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.break-out-api.20180624185252_1529866503396_0.11779003002812982"},"_hasShrinkwrap":false},"0.5.1-nortissej.break-out-api.20180624201831":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.break-out-api.20180624201831","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180624192958","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624183024","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180624183145","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624183205","@atomist/sdm-pack-spring":"0.1.4-nortissej.break-out-api.20180624183303","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180624195956"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"75863c0277bcede5da035152139dc24c0565cb37","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.break-out-api.20180624201831","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-eYHKW0u9eGt9REygWs6HQRpM1AMtAYBV4PJ/MdhT7rtkS5EQrYXbpzNyu+7nCWQExzMc4tSr9IwK6btbOb3Fzg==","shasum":"d0fc4bf103258514afc967ba7ff8657eaa79c3a2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.break-out-api.20180624201831.tgz","fileCount":209,"unpackedSize":686895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbL/0bCRA9TVsSAnZWagAASw4P/0X70RWZ36o12UgpIYEm\ncXAhIIHm3XLY3rULrsVhGw+fMJUIJzlraOQIB0RyBBKWU+Es504T1dkUO6d0\nR0jUCMikFt9m4BoMtAICe/o3XPnhoVYY+YlVdPaudGYdMGA5sNeVm3vzzoT0\nd8n35WYBrynH3L5LS2S+JRueF22HxulsrSX9NoHqUinsBTuWTEq7FODC5+Kk\nZU30yb8Omv3/doj5Eb+dVo0iFGx92N3iboFTnl9VJXz3SSi36Ypi44GPpliV\nsCfBBrd7QtIilP5ak/E0hsIoe7lJdzfWUXULAl4smwppYILuoS2j40VHquTw\nerw0l7RtqJtt6PBPuCWsKEo+OYImcvVgOcefT8DKaLx/Y1rU9uquRAnOKER8\nVMZYv1g3Fva6YOXqcHdp6+b4ccM+CiPdKNRbJDqleHpGWz1KYrApqZXHLZ0K\nfXbjinpVITdxuz2bnotfg4lowXqWBa8l+5XRNb12yxc3Lbb1s9IG/W1whv/D\n7SeywjRY7/rLRoLDNjjby/R7x3RXhL2Ch7O8Zz5EE+AG3YscLryf1+V019U+\nt857bdQIW0XOfuWTGkIKam7Qlrj099GPe2ssyhljSTTMlQoUu+1BEYb/ChiH\n9HlOMlvxT+/gYDeAFpsCVILNaOz6hkv1G5fK+JthMN8LlCDNG5nwwygQ5hBg\nT+QC\r\n=bbs/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDu6+4A4WSCIKs/jg0APNu+dzfzjZ4v8SPJ8oCVW7J8/gIgaX4B2ZeQPxuwoEJK5/x5o1P24VTcoQIJChxkMmKAVJs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.break-out-api.20180624201831_1529871643839_0.19480909014086323"},"_hasShrinkwrap":false},"0.5.1-nortissej.break-out-api.20180625025617":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.break-out-api.20180625025617","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180624192958","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624200728","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180624200854","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624200920","@atomist/sdm-pack-spring":"0.1.4-nortissej.break-out-api.20180624202726","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180624195956"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"480fb300558c37e05b1755c4864e6e3d6be01afc","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.break-out-api.20180625025617","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-O8WSGa0piMCdNlO8ef46srWzxOBe0TX8d+vxpHUVAZlQkn5NEInKvZxNRYXU5H9QkdBTdShPnBSB0uxVqZjfuQ==","shasum":"5b11483a799621cf66647aeb0ee608f82293d0d2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.break-out-api.20180625025617.tgz","fileCount":209,"unpackedSize":686895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMFqMCRA9TVsSAnZWagAAZhMQAJfyJe215YwwcLi63CJc\nlNiYiROVSCA2c0u8bfBVEwaDDOAdyEORLaRZRw5F4l7rcnSiW2GGO9lUPWIv\noERlomwjA+VhudhvBiFKLYMoxy2jfoUlMqrYggsKKaYjRkvJcWaAZOd3YArT\nKQhg7P7bY89FRyNuE924KvO6bruf+Dqo2d8BVNMYfWfxDVtwSn84uKGmUR6m\n1yBXXtcrY+gE9Xqv0PtvdVZ7iXnlVgaSkRDAc1in6uUmaUhIzOn1yqwIT1OI\nC63EYIH+ZHN6NMUOD+YNQRlX4PoqU9Q0LCHqjtg3QgBhJzf1eIHGMMswsC8M\no/3TXe2yO6BR/ZtH4L9faFigg/XRhekE80PiBf2FyS7HKRQ8TSLye0vByPOo\nvsXFduddLpmSKJxIxk7EziIZkdDIA1bWvlUsfjW4PMp90RKCl+jfmu7bVHoX\nsVeBXFR6aTHzpE7vQ/LGYM/GIo0J2F0VlkbBm0A+v0FrJlq8TJTvxMzb1azF\nadG2arptoAikSwaqNrQbBajMIqagVe9KPEAs5eCIgxJiLxAB97QPq1sSBN2H\no4aMHGJkBWYrJG2FKMdkB5qU6RUy8m3w+gBX4+1yihS91EmEQlrUtskjwn3Y\nruJof0xB9CaXNIc7ZCAxbi0rQEbM97CKH1edx3O5BcFPnQVO669UW+N4AF8J\nEdBn\r\n=+ocF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDU7jmRZYiNSVF9H4WwnhJ36d20aNiwMZ9UnZKvltpIYQIhAKF5LE6GFH2ZA/Xk/CkzGHsSMjGV/Ozra5llPz4AErIW"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.break-out-api.20180625025617_1529895564422_0.6966267246142579"},"_hasShrinkwrap":false},"0.5.1-20180625201022":{"name":"@atomist/sample-sdm","version":"0.5.1-20180625201022","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.0-nortissej.break-out-api.20180624192958","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624200728","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180624200854","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624200920","@atomist/sdm-pack-spring":"0.1.4-nortissej.break-out-api.20180624202726","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8","@atomist/sdm-core":"0.3.1-20180624195956"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"29d6118af4b248c299c7bd827dd592f7f519857f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180625201022","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-//RcCpUXTS6XOQhisZQ5YJnJUDW5oLTOB0HTo70KTdtIevd0M27zQIqvIQlC3z8Jm4XBt2BpZ7oTpuAbwvBZnQ==","shasum":"1d3fd449c5fe7f6d09f71ae64ec526fa4a999395","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180625201022.tgz","fileCount":209,"unpackedSize":686871,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMUzlCRA9TVsSAnZWagAA9+gP/1yEmkHUd6DCOySrEy1v\nlEqlktUhb59HgYHVIjwdw7udneZ4kNQPnDAXJeCGVZ/wbrcCSog39EPHC6P6\n22WUTZ3eXpidnktMayIYHt9cm9Nfph0DlLbONPy1RTAt70dWxWimDv4r3w15\nOvy4YaOpXq03yU0jtrBaeGsgbVUL/2kFu4vDZA2aKN6HFH/rGJu5M5XakfYN\nnWKQvxW2RRgj5SMvMW1gQ6DBx/AF12DQodhvnoiCIayU3za56vqoYagTk+J4\nq+ZLYaovP2Xp2x9jruYwktopqU/MRO8sTtR0tKL150SB1XRDNTYP63Z/MlKL\n4vvGybyr4cBtpfT3djLQLiETLIwG1Ki6gnjVFu7ooHbWmQ7q1iwOUlACvzyG\nBqXKlu4JB/F+cXTo5yp5gTb2vH20xdWvO10DxSxG5hPODserqrmDWTESwJ0M\nK880L3PHsL3ebtYvqvYurXqX6M56ljCxsx5RNqf2/MCdSoYmACfwo4CR+x05\nxlpa21c+pI439gC+8mxO/IMJb0YVyMSjDSKIiQOX6f0c8RCRv+Kg0lliDiDO\nP6gXzFZkJ32Dgu4qx+dgbifOfN7roOiV/a++5KwQ7JT6g1/HmCT7tf23Op4Y\ndbl3p8lwqudIzKkCPyXJ1UF1icCrs+/NRVuUkuxSAh9FsyydjTZZMrmmlija\n8wrY\r\n=qCiM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD169IeYxOxD5Rxf8dgIdKuHrGpUwvqmc1dePDngkrvIgIgfwTcYZ0M5eK13ZHjScz8MBhiRjxk8ooloe366ExXDLo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180625201022_1529957605051_0.387703351505269"},"_hasShrinkwrap":false},"0.5.1-20180625220522":{"name":"@atomist/sample-sdm","version":"0.5.1-20180625220522","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180625215920","@atomist/sdm-core":"0.3.2-20180625193607","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624200728","@atomist/sdm-pack-sloc":"0.1.3-nortissej.break-out-api.20180624200854","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624200920","@atomist/sdm-pack-spring":"0.1.4-20180625090653","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"bdc1ab650a45c0f4bf8e627c5a861705fc3a43f5","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180625220522","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-9lnwXNGcGJ2iHMLk49Yhs0x9TluXV3ReRnBi8p9rScNyzJEoqYz2x3CJC9ckD1nSGS072qFpoVjQeODrgwgb9Q==","shasum":"8835b7ded604e79e62be2ea41af4f248d51494eb","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180625220522.tgz","fileCount":209,"unpackedSize":686609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMWe/CRA9TVsSAnZWagAAuIAP/2r5Jkxh3GoSdqPq8ymm\nRE2EEXIcEx75Ne+fCBrxhcvTJ/HL8SEAb0dwpP7csANU2f0sdOsj1Agh6NBF\nS7ewPGWjRgz+FA10UaZ/b0eqAK6Juew/QeEy5MYAFS3QG9A/fh6JABdlW0q+\nNBrG7H16ZEkzkYR57jPGnIAA+GNZk7taD49GhzweFFB4+owoD6jlQsaih6xG\n28YT93NXe61TIoEwnU77aFuGMbFYgGMuqqktE1uUVhq8CRakXJYasZE7N3Ob\ncKl+mqBzQshF4upMHt+9/i8oEVg51WJh6M4eQ2Eu5zAU4Y//fkF270tpJS7C\nUPheTTcbYS6iO2wXfFPDhoFJywRJ/3STaS81CGgq8a+3ywbvmWsO6ZJ+QE1S\nHBWaXCXE5Ct8HABBtinWG0hOAsb9E/dv25uJJ1kHA803ABunhds5w+VDkemj\nLqlKlrU/bb2XS8P/FCukBnj0ZRhvlRyssgfWHtUA8HU0ldMel6uesEFBGSoA\nRk+jGSn2v6iWjRCTruWAU10tn+yxkLuvfyKCeDRCzrk4glVw43qP6sc54iNT\nAkTdbnzjOp+PsVeIOo7NGoEuAgVlU3hGjp/i26G06VJP7Sn2ZS7ewgNs4571\nFKQdPwTN/KDf9JMK9yeDsEzyCDzxp1Aptnn//haES3ZfaqkOw8h5FJXygqUW\nrAc8\r\n=/Hkm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdAjZftH/Kkot0Af+4TbsQ+LvomVrfsNt10pyjZr+BFQIgRkLHtjwP7OY4wD1ZwS/+ANSvmQ8C1ADEfMSpqPO3t2s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180625220522_1529964479637_0.3601625592700932"},"_hasShrinkwrap":false},"0.5.1-command-simpl.20180628232253":{"name":"@atomist/sample-sdm","version":"0.5.1-command-simpl.20180628232253","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.3","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/296205773","@atomist/sdm-core":"https://r.atomist.com/1607152529","@atomist/sdm-pack-checkstyle":"0.1.2-nortissej.break-out-api.20180624200728","@atomist/sdm-pack-sloc":"https://r.atomist.com/478260868","@atomist/sdm-pack-sonarqube":"0.1.3-nortissej.break-out-api.20180624200920","@atomist/sdm-pack-spring":"https://r.atomist.com/1219081050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"574f8023759a5327647709557cf0ac900d47b5c8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-command-simpl.20180628232253","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-sf9vWW9Kqf0v7VI0E8CPCrXCOw1+enLkItTJnEc53LV8EcgDOVZbhNt8V0E3C+mZNa9XLr4Xwna3HA9Dv1usOA==","shasum":"94c7584b7b672e4fd254a350e894ba2c0e2c6516","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-command-simpl.20180628232253.tgz","fileCount":209,"unpackedSize":688294,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNW53CRA9TVsSAnZWagAAHCYQAIdhHwwBmMUXotlZsBL/\nijnJqzjP/OAspy2QWmNgOAKaS+TQfmLN6xnpqZUjp/fYQUqA7ESZ8OXbwxkq\nIyUTIGr7/CN/VEXKXQ7R1vSlNJ7s9xmIbxw3Ug73OK7NkN58p1R0QQWHVOw1\nO95HYIyjBGh/j5EOImneamuu5b6uyJkFNFJQCV8jGSyKPQyagQe0kdxtVYfL\nOKARuUHvpEFrwm07tKR3BVh48yPNOUbZw+rI7rdSuxffO4MegqaYsamCjI66\nPWcWj8hS/gEFyAWpbAbuLAPwog3t9tDEZZE/lsWas2df479OkvzJpECiksHq\nX1pc8I0OmCJKkl8vlwHHIgqTfz7vgxb7eL2WZtLUxcAKvhQ1rheTAX31mcML\nahjBvQckgp+FwqpDVQKsuwl4JwrjPQpOnij2p1VC8LDNHlh1DXFDUQFPExG7\niViPC5RT9y/33eFjN6wpO/dyyhhEy3EkpNCgCMqT1pO9WJqyIpdh2DQ5D4Ns\nuXDuV5bYc6g1AkcwV9PhJJ3yIvhWaIAsJBnKE/V4lj61tAN0x67Ugb3Qohk/\n/SSvsmIaSp9x/+yR6Rk2i+FkQ5iQJhu8Wg6IdUIOJSs+3zRh1RsIjnvHINpr\nTg4OZ1b2MHGE35RazqOt82a7awF8dXortU65PMvrQF2oKNNQS3QfnJe69K0Y\nZveV\r\n=t8MK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnEUOwyB2n1nktVmwm8WqnFb0PkSw1E2x7uR0tZgJkuQIgSFIvrCQWQdSr0oXPXjEKnPt/NkEHFbbZkoD4gKzTVVE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-command-simpl.20180628232253_1530228343019_0.39874598029223174"},"_hasShrinkwrap":false},"0.5.1-command-simpl.20180629132239":{"name":"@atomist/sample-sdm","version":"0.5.1-command-simpl.20180629132239","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-singular-api.20180629130613","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"a9ffabc7a324d89ce55d5bd0891f8f0c5019249f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-command-simpl.20180629132239","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-WvilI5uEag0rO5YwPwwSuY9VWbvM7IcmcEz/S5AjVPeDJZts/DnerfPejoeiqjjeJFjN/oNoujuV/COzJAGGFQ==","shasum":"43f2d0d4dd0710e4738701c3cd3bf559f9b6f1bd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-command-simpl.20180629132239.tgz","fileCount":209,"unpackedSize":688606,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNjM8CRA9TVsSAnZWagAAaAkP/RZv6M1F+eZSJVaO2AkJ\nmM/IP3yTTLuPJK5LGtHQOG0Y8+cNR8VykBq6vrg4MQcCpHXTXzWzeiJVhLzh\nl91677vYFRij5G9MT1TYEp9xA50l24QtE1KeGGneehIiNOJgsKRzH2EdEMQo\ncDiU/dtLO0Zu8doyYOGCOD5TvD+pXTFwoeCflb2zUXNobFJ2mZlCqKuO6Fy6\nRldEo4kyv10l/72wz4DoRS4gCDStr7b5QSIg6L1X8m2OUjwL0GKIWv5yg9nn\nzFn+W51Xrw0iKyjR0LNDywpFayYISWVZ8C/uXRj35Z7iMVCtGKLqYAH1n4Du\nc/Ay4ZkqCjN0SFERalQ7WqE33CMbB9d4fJ7s3WEHGeu/+xHgyQpUPwihNEE3\nZ82wSzqe4Swb8IWE981way5ySPKoUsgFU6TRwkz4w4GbRbLIiV6/QGSSDhW9\nZ0+txNUvhmYxpuSRA3wq3C+dYNZRbChwZlkVu+mRtYijOLbgZfgHNWP8a4qv\nwxmVjem6D1oBvDi7qrBDM+/kPQbxOU7gsbXm8NYR4d/990kupWgZFoZm6N3N\nIjCwiJPhy4MUTGXFqsSfgblSOJSF4JB/6Cv1TRdKxv69kvu5EiJbA8ZfkKBV\nqYCPUFLNjCtE+BTfku0KIituPKNd2uGy5czRDisd6XjPm5bo2jlOjVeibGkI\nMexr\r\n=pJ78\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFRacq9k7oIur0rvobJAg8AWQjsOCS3sBeUJu+vuU82GAiEAm3yVIvjFnhykIzwsg1igBa57vqDhP53Qp3cA/dADqeI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-command-simpl.20180629132239_1530278716879_0.723699237318747"},"_hasShrinkwrap":false},"0.5.1-command-simpl.20180629144429":{"name":"@atomist/sample-sdm","version":"0.5.1-command-simpl.20180629144429","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-singular-api.20180629130613","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"98c055092e4463e0e7c3cabdd9d06e516812c967","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-command-simpl.20180629144429","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-KeGRD21R26XIgN98qvAz6T+qfS3sXwSGntAbM8tBvjf0/uMw2HVLv8Vu3yM3pWZadTh2iMg3RQgpNYENXqKSoQ==","shasum":"cdab5e899cc73d6555899955bfe10708d1ecc8a0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-command-simpl.20180629144429.tgz","fileCount":209,"unpackedSize":688679,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNkaLCRA9TVsSAnZWagAACA4QAIwQw5liJkCxZAQ43TWe\n10Ok2kGLOYpEQc4cQM/ewUQIHA39FGbWsYsUZfQW7+VOBh2q7maic+k9urcG\nOOm5F1HFWlcTzIps+j4juhkFTZDRhIWsdXlhzzYfTIh5An9DvpdaUD4gHeF4\nbx9igpeXy2fBW8hLkflRSdeY7ZMagd/Kv/Wbt9vlgQrqJiKUWzptBinXbt77\n5UqaRqQ7cv01VkAVb8WnlfsrMHnnPGYncA0oBAlI0ygsA/3tRuqqnkT6hcf9\nDCTq6hxb3sP01g04WNPLWnCq+7gkuk9JItBnabhtlXnCKWc9N+IZ5QFx5YRs\nYJZrA5BqBqpIYjuu14SGXpELOA09EEkeEkoXIazhLne5TtpYKfaygPOjKxXN\niMOHfffTvPaA3HKV9gVC2/D03vFinSYLNsbv0kR9yY09J+IK8mo9MzOCmcC8\n2SyERpVoOPOBDEx+68OCKQqomAFv5iPfl2QAbQJCP0Gr2NiiV4Mkm+R+Xru6\nryWQqyHAkk8tfUwbOpRxJtbuA3TCLi2xd5LgaAT2SAN5JS0pM3ha1rCcN9kk\nemb1YVI8GKPWkdjVXNgLMIPtsU4JpTqGiU5HZECNvDz9L0+iCbT7C5WkVrtv\nyzE54F5wqhuer+4Ut1qrlJ1K2iRYkTpOO3lvzQgEZTtL6dGZ3Yz8fWX0fh9c\ne3if\r\n=ExC6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCG+PXaVuEefXctI90Vsi1fUM1dW2sbnvGBjyjBGovprgIhAOvCKXow8tgmGBY/O33nBth7SM1z5S7lw4kfYKu1XVVT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-command-simpl.20180629144429_1530283659654_0.570654167033446"},"_hasShrinkwrap":false},"0.5.1-20180629144513":{"name":"@atomist/sample-sdm","version":"0.5.1-20180629144513","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-singular-api.20180629130613","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f85af53cca9359c0a7ab4017df1412704f6abe50","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180629144513","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-jj2FEJaeFdqFU9FRtgcbrfbW9H7jzYgSG1wNWkgSrRu/d/rFsWvky/mZy/HXRQyBOIDGIMaIlRXqtBzmIW5R4A==","shasum":"65b59d7c2c721d8265d1c5ade40e77cd8bde9a07","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180629144513.tgz","fileCount":209,"unpackedSize":688666,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNkayCRA9TVsSAnZWagAAb5QP/ju2FyYHu2gcO6RF9EsQ\n58+B2NHFoHWcdUftdlqoQMAAzN0RXoXj3aKE9IldjhlVYyUb2zNA82fhtrvo\npLL8Oue0usINSj8Z4JIYfs2MalqwOV02ATG3OiAl6JyeRWzaRuZcqQZdeqqs\nghLqPDyR/j8v58FbShO1WdpgEQcQmYX9j8wra6/azrWkEnR98ga/QKIkCv7f\ncANUPKNJ6gbumG+dvkCsbL5P5jSPjUD8PjfcohY+4xFCF1xLDbPLLwe0qlSq\n5nkjsLuaS/6TKTLzdBS5AuuwIA3F6e245WouSdfTuoKjrph1V6zqqNcK+K9y\nCm4vNX+DWD61Yj6UhXpUMvO6byzneZWOP7uGJcMJY/sgP/RURpwym2ZUd/Mv\nC/DjY0NpfEC+8ZAd3cqud5UFvTi9y2YLZReR8ArEa5fXb/zDQ2fSdqdtsGzT\nuiaJAxA/0A8zD51vy2FCvlxD+/ADS2N8grIlHSgGdXs+JS9UW9kxKkoKwUbL\ns5wt5VGKKuRuRDZlvQ+kBCz800a24mI7NxHNQSZjDM6eJBThMw9EGUISN+u3\n6sVK7WwSOTiND+KWr45OaqVmUH80iDDktCgYT0YBQbO96A3brSRLuZu4tk32\ns8IKIhVrGrJx7jUMt/j8MifTzbfK7utDnMsx3wrqI0ZxhRajferC8E+e0Yha\nAvNp\r\n=z0C3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcoHJHf0j8yFJ2X+0moa9rGKvG7sVhM8Bt7rNVSkp5LQIhAKt8YQ2Dnofu03hUlprrbIu4OkNAIFHb1nG1tZHMbich"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180629144513_1530283698617_0.3013288044488014"},"_hasShrinkwrap":false},"0.5.1-20180629163828":{"name":"@atomist/sample-sdm","version":"0.5.1-20180629163828","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"2450c3a410e5660aac59083e4fa44ae509a655a9","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180629163828","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-obURWVehnmeka+h80QMqCLbak0TryaIalgEVA9EmerFU1ys/6Dcp8p7D/zrXub+zB0vA3WK2U4XhXw9xE3hYww==","shasum":"7525c3c9b86f539d0328bb808c84b3532dc1b8ac","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180629163828.tgz","fileCount":209,"unpackedSize":688640,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNmEdCRA9TVsSAnZWagAAq3cQAJC8u4prTo0XH3VezePW\nTftmZoscsaCNs0VzmPosLRrFYWpNTiV2rchlyLqZ/TfHn4INXSaDG/Jtlcb4\nLi4eT1t7xkxCwG5MuJysn70A2R59DU05N3jrgGraUCwc6Pmb8npUyfzYt24s\n04rxhAg2Q7FrdQ594nwN4PsQQrT3AFja4/9Uvw47ga9X6+f2axN07Yly+UvB\n/iS3gZm8mpn3JEfYqwV7EWt/M4SRINvV9IWgdgcXhhGHlF9/OmowgxLVhf/d\na2472s9Vs1gFLIgneu4cB9yebHNug5bi5Ek1PeklQDMnKhItlBUaOYeBs9vf\nrcPqoj40mUjkKA2b8IaCkMxonDU0LAqPNT5HaYrRQ3FrH2jE5Iwf++AQkQZx\nkjE6nAwOOhYervv/lKRJXrRomdlXdHta3a4DZKFrvOC1SX98k5vS+cPTopuY\nVW5nSRTmd7+PhF6NNs51k8Jo86PEfxz5y88Dvd1qomFcyiqpTBNZSb8INIUx\n+4YED5EkRw/5/AVO0qlPgko8kCc+TKeoY6MwOvu40INgrKcof1U8mOl7dgVR\nmeeFFBewzUbGqY9rimT2bQvIpF+0GBXddDzZUCoemiuVxxQMAihHINIHtRLe\nNhkaX4uwyCzgV9Z7PmERdpaG+660dAXH24YMyZVfWsR8bLZccJVPvPiYXJfb\nnR0q\r\n=adw2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICoFpAXAeZoS4D7LeNsEQVRL/U/L6cd3FDLpHNeXTUk0AiBYStDpNjFM0odBgod7AE9xNvtbOKc9apPsm52MpuAp7A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180629163828_1530290461228_0.7218602882330185"},"_hasShrinkwrap":false},"0.5.1-transform.20180701214849":{"name":"@atomist/sample-sdm","version":"0.5.1-transform.20180701214849","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2516744398","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b24d9a8b506dc5ceb8b5448ee5f13016222d166b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-transform.20180701214849","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-PKzrCybv6jmRrwx3mjYI5mkqP1D+GN39JAqT4YGl4qKC0zhiVgn7pOGX2eEW96CR3IJFbjMDTLlL6o64RDacHw==","shasum":"3d19880c07a30eacbc210a2215ee823d1f7bc516","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-transform.20180701214849.tgz","fileCount":212,"unpackedSize":691016,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOUz2CRA9TVsSAnZWagAAI0kQAKR3cClLkCcvEyGizund\ndB5thv9vs42zAC6XVc6ZmJJ67E/nwC8hM9UIYpWhD10HoCTbr1T0eXBDETOy\n0yra9U0Iy2PWXKftYkmHEXai83ysK/MwZ2VDWRKEjtTlvVI2BGSggLlTFNW0\nB+hV7yviaU+Cd4L6MxORKBUDdGSwhEYq74uAjuxvXmRndD+HXz43o/bMaQPI\nrlNlEYWl3gztv5QiPSPIyiHK705BL8xZVc0O/r4KAQ8H4oiSTjf0M7lQE97X\neg2Q06XmoSuKffVphvceBKrxpRpyQa0gM+m1MjjHRgQC/vN7y3bhug2HNoDW\nHV3O7nQr9+TMSUpONuOJCUtn7pXdnmSA00e2npRNh0ZVtq5sY34D/KDZEF2K\nczarPR9hOXPkQsEX3dEb3HDrDBnvL6PaA2QXdedDexfGO3Pf1Fx5Jw1d7S4d\nuzVNGVLab43iFZARHvMs8+oHQ/qdTqCnStRq31FXm423m9lU1+fYxuurBTTn\nWnSR/ZTiUCyKR7erJceTNzEdu0JyDDu7vxPWHiKa8l3rzfRgOoBekp/vCy2E\nCDumdf8VVgEPxrg+D52/WJWG2O7uimW4tHfd2qCanjZdzgggaQaGtR/zbOyi\nc0ZzJMztUwYYLDpz6FuuLzR07/S69MbzWzjkpY2UBfDVFNp9cuNmRCgQ1fol\nCsZF\r\n=q2/N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUMOCSVPBd+JoDVlyw/9HKUTZh5BDHuIoVItcAB+3TawIgTU5xKueHD3m7IjGLQRkl+u7g8X/Tdli7CEH1tC9bpCI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-transform.20180701214849_1530481909971_0.6299857629846997"},"_hasShrinkwrap":false},"0.5.1-20180702124718":{"name":"@atomist/sample-sdm","version":"0.5.1-20180702124718","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-20180629192934","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e45b9ffe5df1ebf8ef897b2a50d709340fc4d4e8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180702124718","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-S9Em/QGdKoHzubYfx7NoHBfvpYjbHzEEEwga9GS5jS75CjiwSrTa3Zxv2+9aOhM4OMM4XlYnu2qwovPmA6KqyQ==","shasum":"c87a7a77e219a93d60bbca8b6ccf25a8dba137af","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180702124718.tgz","fileCount":209,"unpackedSize":688640,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOh+bCRA9TVsSAnZWagAA8p8QAJGuk9TSEsmB1dlkpUk7\nPU1Gug22m8Rph9EVtoiq6EFY0yBbvGlIyi/Qb7jiwazqoAmoZ0wfALnwY/9X\nYuczHWRAetriugTBCWze3BJdSzXNpG2qD//dGNv+U11ump1buuONDPuyYado\noXXowLJZ6LV9SOp6Bkh9CjY8caLI3duu016gg9267Dmno5Qwjk4nKxkTKYz/\nDhVxWJYPFoz6Aaskd37UIhw/axQ/mQWFA6MfEegIZ4JT3My67HTgXi82/jv/\nzdJrnXODKC5PQfdLK+KHwisKFiIWZArzI9ApFwg2Jp74t7IAq9NTgLNoUdlb\n71SdExflAcRHsuPo8/oTZ0WFqHM2LdrtFmmIzYoHSOMDrjedl73HjTG1loSi\nus9K+xlahDc2Ernfpq5/ZAgu9HAprfM5pHZ+7p6sZsCV0a6Xvi34KXQhfXND\n9XwXma19buzuIz/ErYUcZ23mCDuYn+PrNxuy5Mt30ih6cxrLlx3WIehMUcIW\n28PttNvpCTJaK6vNx2AcwDlpaFdVxpfh4OP8v4aHL+K7mi/DlC3XiojkxjEt\nmg1bFNSeeV0W850AjAVW2LSkUR9ngyfHikPhgk3byjbWbLjMlvt4810UZbCk\nO59FH3q0TIBiRrarSzPeyQHG3SonRYvd/TOyd0WkgG0jWCoyS9aQLKtAd7Hh\nSyQm\r\n=QiZf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBTHZlETt9uezGnSL9kya+Z4mK5nVbEqgWv3QpaA9/o2AiBi68+wqGwUcIex9OZLY1b5LqDf1L97H/Wq2PCDgn+awA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180702124718_1530535835095_0.9224334105305743"},"_hasShrinkwrap":false},"0.5.1-20180702172600":{"name":"@atomist/sample-sdm","version":"0.5.1-20180702172600","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-20180629192934","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e45b9ffe5df1ebf8ef897b2a50d709340fc4d4e8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180702172600","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-pNapAcnO7nJi1uOPJdw3Hut3R7ldzWz33SdK6YcJcsEWc0dbnXPtqI3EOcs79/ACIuZ/CDpTban2Ub9uYXgMXg==","shasum":"28ced3077b93f0394e0054314f13828571de0c9b","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180702172600.tgz","fileCount":209,"unpackedSize":688640,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOmC8CRA9TVsSAnZWagAAzXAQAIUwD0muRMkL5aYJ3tSQ\n+gh8TPCcPrHW/oTnhRHDdG11WZ8h42RXZik+Ki9zN0xHDrmyNhuBtWkZ01WM\n5673dN7RjTpbhk5T1qEXQgAoC38XT/zSP9P557VUhM/EAE9OEkeG2RBgJ/wD\nlL4O/Ww0JDXZWUh891y4H8KL/LhY85KdNjMoI6X0w1klcSpzf+Df9JJYUR4v\nZNnBrk59cRIOFg2n2bhLugQZL75H4Td5uLKGOXKt5uA41D7r72g3ophtzrAM\ncKFON6Ges1+M85RlkE8dvmT/JbBfzwcYCWfj+i+sgZLZNYXOHgL0veepgaL5\n7OcWWbD8E/SG4PHnzyzzt2GPYtlKyn03pQXHm6Pwwu2vIB5uUta6oeBeB0Xm\nD58ojyU+UtIgHx8MQdtalI5yWuFjvqINw9BhAKYYbbQkZWK9i3lVSgvKm7tY\nKR3ComySx8Bjn9EK7u5Yg5OSU6S7GAO3C12lHasLq5kR/7Riplle2iGB/rer\n/8VDVAats7qUPHWBSS4JwjbSYK9Lf3bvZCgnl/ubz1tn9pyR2la7I3gZaUP+\n6vyiJd9EHww/A6eTD5IARcOO/NwLR8uD/pqFNQUCrc4vEQuqtmOsrHNe+Mb3\n814W8e3mq1dpBdGV/akP5LlLbAzn5b4GVNCRJ5pXY0S+nD9hxq4cKjXN4ZX3\nUyAw\r\n=f420\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC7pGnJxQVr2PF1AjtiGQqyQ8X0wOihRRH9GXssTZf8LAiEA4fBCsmquvOGNKuBHmE/TnEWQACZPvgr0aPTTvlXRqhc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180702172600_1530552508635_0.3932603783955817"},"_hasShrinkwrap":false},"0.5.1-20180702182301":{"name":"@atomist/sample-sdm","version":"0.5.1-20180702182301","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-20180629192934","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"eaf31e420dfc6f88d0eb7d3a9fef216815bc8405","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180702182301","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ehTJ0lkuQdqXkTSwOjOAStbnwkz1cuRl3CVD32xy1aPqngZRfgSRhpW6Lw6KUO05HPVnBjYWjO07cBmvnGkaLQ==","shasum":"f05987d26734ff1cfc76a9039044fe43a30f8a87","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180702182301.tgz","fileCount":209,"unpackedSize":688384,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOm4bCRA9TVsSAnZWagAAGOsQAKRuOtfhiLk8ziZOaJPs\n0pVv2q0zP5qKX+CkFSsX+fYDriazWAJZYOq/05eHPu9JEnOAO3K8HY1mP5ez\nIuPpEbxbr7A6/8Ny2RHkzJp3mEV0TQdGA3mSPU5JOWyp0JjGhGqwiWoqNzSF\n8GG4R/2Btem4hlDUiRDuolpRr7wZIfl7HdpaoVQUBYR8Qy9qs2ykolajHd2z\nEPB4NUo3eI1L9U7dQUFD3aOPatGTCBoFWWwZcT8Vxvgf20sy+r6YJ8xzXHmd\ngz9gnkpAfBiE29ZAgBrqRJEM5PhS4YMbPMMZSjuRXN6KqhldlEsMp3qv6aWs\n62jPU71eneZLcH0gCtr29kvVlCWY8U7S2bSBScre459Ok+1ibn4EGiJ6x5Ga\nP/BPvO/9yriRiuzCQ21IPQ3+8dNA37sZel3Vfl3NVki8RZ5IxWXGxx+4A/Uj\nSulanHVfE04yIx+46LurQAcF+mtote/c47bOR8dwL/iTIMO5hycnDJ66JpFc\n3JuyA8p/W0Eeyw1FbO1m4iBLJDAXwHmdO09DXozaM0LcTxSFJ9OmXpDALqXP\nshH1QgfikjcLJ94z/BVIhf3DXgMUfGxPg8TZwMz18Hz2Md1Nppw1PQcxZXdx\nzgGOcJNo2BqtWQ0JTUWkjcmeUo4rnbEL83i0b638ZtQDHiudCl+4Nbn26kXK\n65jG\r\n=9faa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmbmoPZisTs2Fz6A+qHb+gU2N2GsrtqyafpqMC+dLtYQIgNYWIKpjZYo4zbC7OAtyDcJ96DIlbJbmxJqotUVZBImU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180702182301_1530555931709_0.4262838447302062"},"_hasShrinkwrap":false},"0.5.1-20180702185148":{"name":"@atomist/sample-sdm","version":"0.5.1-20180702185148","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.1-20180629125403","@atomist/sdm-core":"0.3.2-20180629192934","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"eaf31e420dfc6f88d0eb7d3a9fef216815bc8405","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180702185148","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-CPMJ7KdA/F27f8Mqxu/YacWvFKydHKBxa4SDOVjQ5lz0bG+jEfJSpoAw5E0h9ad/nhfUddI63bnq+W3GFAILIA==","shasum":"a33e427d69da89bbc522c509e1789ba3efb9e128","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180702185148.tgz","fileCount":209,"unpackedSize":688384,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOnT8CRA9TVsSAnZWagAAxiwQAI+kkFSDKhzjLN0W2L2Q\nPrw5nmp4/FIPpFRF5uGELywngJbZ77gy5v13jSqhyXMbFRlZKGjxZAbTNrhA\nihw3cqzBk/TnmlMqoRfOWyW3SofTtt4ecUpIUscirCLywsAGSOaeoQ9yS1Gm\nz2ahoVAQw7aEs0llHGSGcu+ur0lnyX1XsgQg5DPevufTxND0GHToLzgQVESr\n39CHhLvSo0rJDn/uRojJxzFHuaazs4tMJN//Kl68jb8pbVi/87EPjVyUxNWC\nCFBjml9YULne7s59KN3fnz+J2ExObDY3CtzTZepbN5NzcW+k3hsM0MQ808UY\nwrCTps2djwQk3yX/2eamQxbBNPah2NbbDInoVY/N9rxfxEg4OwnrYcqccu+B\nrtspB3jsAyuVMzikYWzK9TxX9HagG797AvM+FTspTLR6JbT6cQoTvo7MNXiR\nVruNqAHsXFFTyN1GdE3GhF/HMKIKL+Eag4wwEYrIQvro/YKeCJ9uTm4rrM7B\nR8CE0okkkxbuHiJ+mYMcTQ/seOzw/Q6Hhjap5Uom01+eHsh+e4NtKfVNp5r2\ncNW2hL8s8NiDqSjWJmjwhFROiXdyPztTqE8Eqh6Hmlr/Pkyh8/JN968yxavP\nm8lxmssNbN1h/0+54wtHbWrPsvErKuegyBmSwoU591UbGsEbXXwf/x3FDK49\nDV0Y\r\n=y8bl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID7bxjpggHdfOfBYpON1R9Ex3hEyZbqggRATllu/0yE+AiEAurIORDDta2u1TRZIB6mUEj9z0XXRzrypKh8RRhCi1pk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180702185148_1530557692765_0.26392614864913777"},"_hasShrinkwrap":false},"0.5.1-transform.20180703021719":{"name":"@atomist/sample-sdm","version":"0.5.1-transform.20180703021719","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d19915263a3da6c2a6cf71f98045cfbd3954bf16","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-transform.20180703021719","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-KIa2jAMR4cHR2QGe6gR7H2IFToaNCREthCD9wa1W2uvdkYEysT8Y5EB3wjSMdeGk3dnKYo9l9y+OvXsJuVp01w==","shasum":"4b01a674bbed024424b0116a22c6f1c212878918","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-transform.20180703021719.tgz","fileCount":212,"unpackedSize":693665,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOt0lCRA9TVsSAnZWagAAkNYQAJxcw39yuTi4PvC7KjUw\nW3Ct/ER+FRhHFS/nRheWvEp4yWieZ50Xb7eAdiJXviLWFf4XHcBmT6huvSsy\nPBS7TQz51zyxDQMTXLLfTYh1TjV8HtUqazZ5/ehi/WxKYchoU7BS2xSqHxoc\n9IQRCCVNjAKBcw2PtdBKSpk6/FaX8mEcMz0+1avxtRYuHqI4hJBvlrOPDi5E\nocpeMyQcahpIr7TR3p02VBLao6YYSPObGvwdn5S5X4BDaMQ0SUvB9oiAHuHD\nYq9CYfa0dCh5Doahe+D7GrVAUpQWCMyv7r6y4BUF5WYEPBOvbVBJcm+Ykejw\n9tiwPZdELys4BDsTgELIgOPAsbxc1OY1jZSun1+bJ23dm7xuIaTi+wkBuFpu\nr5lRQmsok0qAljWdQVNoqJcHAeywwvrcPr0KlrgvG3SbbTLsfwuz6Tk+K8a3\nnbCDhhlm1vFafLW7RAt8VMDgZuRXsszNDf7BkXpKru0ug0BT6cijDrdc6njq\nxJI1zlfUB23A23fPNQ3tgiWAffFS7OFxybZ1TgwVdRy8UpmjrF/xLc15Pu9g\n2e9Y7buiGhejj6Saqs2rwYbmO8uxWYwijVJIx/JcXRixIkVondjadeGcj81Q\n6XIahDvnans4+vIkmDvILmEegBkzrpaPhcvsJt5z5IIpdeXUJPZ0na+dJ9hD\nU7vy\r\n=R6Vn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCICnAxHu7EeC9dG7TwX2PR00MrzEIi8KhdOK32YxjM1gIgNhuaeggbzpsvXKU1qo/M4s7rXLI1lIKbhvoZSRthOe8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-transform.20180703021719_1530584356995_0.5844402358881342"},"_hasShrinkwrap":false},"0.5.1-20180703024254":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703024254","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92aa440dac9b0ef4e1914c4c1b5acd81cfd36dd4","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703024254","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-oehXpbiaoR+EW/dV0ppINVTaKjylCEJuLW2vppDC6ceTEmvZ4J1g3lhHcYaBAHSr0vUUii/qLhBaYJbn4yGdNw==","shasum":"8bcf1b1a4807c1be0071b47ccd209ba160484efb","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703024254.tgz","fileCount":212,"unpackedSize":693399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOuNXCRA9TVsSAnZWagAAPnUP/0h1s1hA3Ep1DG434ZKV\nqXN/YD10QpOuvd1x5S4Zck9RISytb9V1YVo8PxNS5VuAgx/HrBiAKePZ21v5\nFfAwfqnt/DT6p8n6EaG4kQt4U1jLcdk3aBNOn4bvm02RM9U96/2z1QmAgQJu\nJJTEJkfBpMyoftF6jRDtc+m/mGA2friY6EieENmUNg3Ljpuks2T/ITKa4e7b\n3Wj3busa/JtNNPQ+NSzLjrbl2vUw5t+6wcHuEWcLP5o5chGhW/IZ1EJ84Ls/\nk275dZO5Hyx6l9j+6hCjEKNxe0OcgKMmq45w+t8RX1gY++6EKz3wHJZIM21H\nNv3PPLxglzd14p4YjHImKlL3K6vaInGdF6Ps6dxngmqFkDb0vzCmgaN3mLx1\nB+w8lJjPjR/SR+zSb+gd8JWb0GDioeFipU2pcMMoSfPYvzYvva0dIT07I1E6\nz4VZAspBxanh8uyET1r33tWURtZQyGnxiqd0LiP3tdOLd8okBeuGHxRzj46X\nNlty5mf1qvnCoayoKnhaczORmAvKjmdu3anONjisBvMiyliTmnfydJJhfq0C\nFaetd9jPysQtF/Z0fFgFwSxUyA0FO4vbDWdiQdMLNh6JuEE9UUIuXunSmi89\n1B9WVi2HWfFz+T5xTe/griFD10zqtuj0pqwF3mqympFfEfjOTb89YhCDckeS\npPhw\r\n=/OCL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAz7WKDPgbjvEAksQzi8tc0OzmSPqaTws0TL8QCZvUTaAiA5cYyZqzovNDwuDzNhHoEL0L9AUJCml9CfLPJZw1qE0w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703024254_1530585943899_0.9299215499975737"},"_hasShrinkwrap":false},"0.5.1-20180703144541":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703144541","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92aa440dac9b0ef4e1914c4c1b5acd81cfd36dd4","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703144541","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-bkWD7TASrRhql4nDKB0ibOwO2fmcGIqGJ5l9ebm4Vt0fLjx5fRoac0BSDz9BhsLonusyxzv7Exu29NI2eatWsQ==","shasum":"b30cb943ae6844bbf6840a272263f7318f9ffaae","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703144541.tgz","fileCount":212,"unpackedSize":693399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO4ymCRA9TVsSAnZWagAAIo4P/A+QC5a1lzU+mPgVD77h\nLHsl7wPKN3YjO1z72Y0wmupGtZGWbFuhwA5YaGzloX6J090vycCO5KImFT1e\nLUgAE47d4Tnb+w8FS5vueYsPy5mXYTEOjQMLIGWpNIQDMchqtuYDv3Mj3RSw\nHHiK2SLfQ5z5pPFeYAxA1OYU7397ln2oXxOQVnGJjaAFQWJpRliOZXX0hMAU\nhMGBH2ZjaASfmYdMpm7PoTlVrRuhGTC66Ase+uj+z4WcnQkcU8DdsI+S5W+Q\ne01BlnEV7lAfoFjQ//W6A+FI+7fccxY5/jojFZ66OMq3i2yeFkVVj4pgA/hw\nGSn5gt54BkHYKg7JLug4z37mOQBYqBxSoIIF4x4PjVFTIcdey1Y9yGFvtHKC\nN5YLDhrMU7zNlsQHvXIsWRWe8PaUe2TiPbge3Muahq5dPmSqFznoiivzNXnJ\nMfnEg9F2Cyf7ZuesKow6WF5IEBcJkkXqo6qvv2llLAuPr3g2IBZIBJ85eTm9\nroTfct7p14/gRSv30eU6rFleGINE1tSmZjeufh5ve4y5m4kihVRu+VAvem7q\nHH1Vf+15yfFk/N8LoQlez5Ox6SDIqtLEftXalus/o4DQXY6PJwF9oXUaF92a\nMCOG1VGKE1D5wDfRL6jE/x94VyotgXTA1KcAPIUB1DoQH8JedO18yvHRiYKe\n6gHk\r\n=ldQO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICO/4Mhe3bm1pc9NaYsb21kmDdB9BAq4bYEbfDVLnCoIAiEAyVkSdog7Mp/Cg8MtCmyxpECecS+/ogwe/ZD0SOSwRBY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703144541_1530629286099_0.8889578443738304"},"_hasShrinkwrap":false},"0.5.1-20180703150124":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703150124","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92aa440dac9b0ef4e1914c4c1b5acd81cfd36dd4","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703150124","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-mxoYHCfRxo9dxPO6WGppcGMxEsIsvlK9/avqLokci+hrCzj0vReMCwnSpzVZzkB1zAtTDyjQ2TlcjT9l81ArDA==","shasum":"2212090456f5411c733a2b1731c47f2b875c6bf7","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703150124.tgz","fileCount":212,"unpackedSize":693399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO5AzCRA9TVsSAnZWagAAqLwP/1KNIMa9w3D/ymOzzcgL\nA+syew28y49XMKo14Ap9vlIpte2RhB76im7iVEv0txeolNTboiXNFSzQjcw4\n7pnrcha6JfbOVIkuEKTUE2ng67gIsS5hvHbXM0ChGaVnWHIXq6NQizQVzmuR\n+nVEtBOAfNaKTSOKwhSLcXVXP9dswiJrLFzW8hVEWMt4y9x6K31dbrJqc6TW\nlOygUGkjukMXVzKvAlMhcJ9/te6v2hfeVlJpf08efH90R46sy5EFCJmk0k/t\nAUYBmmmaWz60+OVpIVUwcd6mjX+FK/G6Lw/mDpHEOFgZt0KReN5pgYCM/1CE\nrYmUC/6dW+fgpZvyDLYHs4ITwJhsFcYVxjDu1kcb6qBUqvEekvBtGlRvZw3S\nT3cgSbbBqo6EyHJihs4Stmj8FSk4jqicyhp5SwKrdD4L+4BRz6udYYmCKKWs\nkRlIZloMCIyUhWDUyoH78A+/o0m9jyBKaZU5ImwToggIjvq3n78WGnzCUXUA\n40gpfZerOT3sI/BKlIRrubdRCJDe76UhBrpUfrs2wFWmQRP2pPFdbqJX42VM\nnHj/Pi0rdr/SRygRloI5GSNa0BI21xAQ85M5s38mZPBpbHUPq0A3qfO1MWcH\n3eaqTxSJinmo+G1lHkRRHQwJNodACQ4R5RdE2nTHpy+IRC52T3T+QVqJ9UHB\nK8X9\r\n=mZaw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAlPrax38PjmIhnZOArENarddrLcO2hvAmNb35wARVTJAiEA21qg31RBGFMxkFOv9ndexyVoYcXnIPf7QkVD4EaS8uc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703150124_1530630195388_0.6549171653051891"},"_hasShrinkwrap":false},"0.5.1-20180703151107":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703151107","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92aa440dac9b0ef4e1914c4c1b5acd81cfd36dd4","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703151107","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-POmvDSG8INJ1/90jeVy8ReZb5QSrUahpJr6JiY/bxCHNVDLbLdCp+VtY9vt4N2SQlUSBeR/1XUn5gFQcgqKlVg==","shasum":"736ad6e3f37caaddf34c2e9dac0667c664287637","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703151107.tgz","fileCount":212,"unpackedSize":693399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO5KQCRA9TVsSAnZWagAAxkUP/3fBmlu1z0vN51fRAlSn\nDzhbotdHA572Ynkx02CpTXl0ngrGTMYwJIwv8tNeNAaGeHAh93yxwZ2KtwnD\nAhRh7fr5Xh4XUG5qe2jMdnW0wVmktAjRwiNGCW5ypWIUNsiKSgPHKQf4sc6g\nONsWsQyFTiVqy/4vgwPgFuU16CsejiA+x9SX+KUN8hkmIGBpZGIOQX9T0ziP\nnyhP6fYMkqp5kqWyDkyZ7mYw/yk1vAEAXJrKw86VcOnBrw33yAWnXI2L4R+B\nU6P+n/4XwiUmAe/nGPqd9+c2aFJlzJmWZnYRjCquxTYGtEGdnXFd99jNf44x\nUzyPTjNY4DrLIEWgxfrg1B8cIIXs1l2K4QHIlK3J1y0ODHSmM631XkkWpMmt\nWTF9Lrf9/TVBURx+Ej71yNb37n1ZFfF6KKJwtxsiJ9qJH2F/bmX8jcS8l2Ac\nQzSquCHE7uWM7aULahL4enfEzZXOwB7Xq5ozmoypGVrGWs+vLUXR7PW5YsUb\no7bnWCr1V7QpbYmLSekFefQoJN+3UyZEx3IWsggd6Ge8BJ218DIzcaLwTMJT\nCy7G2xSQLeBDvK8tfC0TBd1B9lWZEVXQOuKCec03pQvflT1RIWvqA1t0NxoG\nXBwGYiheKbJpLDhFnBcAIi7IH+43pBmKP9HYKasIQqerpvHIsEdqRcfHWtnO\nQo/a\r\n=/Lcj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC8ZPaeOPAzw9BhUBskCfWvSdhzitNS84THW6tYuE5ujQIhAM41q5nB/qa8zD0ZVq1djB6P0W8erClDIF4YYR4FKd8o"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703151107_1530630800387_0.3231327005799456"},"_hasShrinkwrap":false},"0.5.1-20180703152650":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703152650","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92aa440dac9b0ef4e1914c4c1b5acd81cfd36dd4","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703152650","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rqhZSyFZd4iHCC41H9qalX2GkFllz7XiBl8Bk00uFz+Irvb4nvATURk7IE4DcqpadBNSgK78qsGihoVVJO3txQ==","shasum":"ebac83bcce04c888eff49c78310be461bdf594dd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703152650.tgz","fileCount":212,"unpackedSize":693399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO5YxCRA9TVsSAnZWagAAJLQP/1ZF41I2KE+FvD8AyfC9\nFBt2elwsjudcOEo6s6SWZFccZ8cZHtatadDp8mQhMucm2XXT9wCGZ6GFInV1\nYX8xckcdISZgsDRm5S116U6XHxmrAL00HrAYw446CDcFzvhVZ29jJ5KUSq72\n3lOVzfr5viLFGtuWRSNIqCMpyIlxQJmvdh2XNvNCVQeP04iIXSPVm0Ji9zvU\nJ/jdKVll1pfR1yB1Rn9MFkIWoVCy8SwWlYiW9/woYHWkfPae/rqYESN1mEJF\n0Bbtyrr4RFEVYkrVOXfw/XdhOf7vGhYKVmdc88jDXdmsXg6eJsX8Hyj+7yJd\nS1cPbsKEQ24tK4caci9y5JJ0lN7ZrhwPe/qOVkGI4zV8KXxELmTFdgSekz8W\nu/MdS5ml7ZVSmR2nXJ4i3UFkHWW5EU4J0KsJ6Gmal3G1BmnqWsb+Sk4LDVmi\n3Hwmbij9Jl6L7O/iz8xhBE26MrtA90OKzanU19HGobDIiPCuaG3+1pFfW2mM\nO/QdVHQtVVrXyjbIFW31ALRNQp2yAi5IJamiWKT3rRbSObBbpU9q4T4i3Zmm\nSXHVATVzdAbhFXeEhneQh7Q+lSBrwBYh8W9pbdus7ASow/99mWxPutN1EESg\nwfezjPVka8oQdXUJpTvQqMz9TkGXroY8UB32Lbh51BXdaEKBAjgKNIVMNk1S\nOA5U\r\n=QayU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkf4TPTH6n8ClC9Ew0/qC2DW8EJS580M1/Nfyyyhw/aQIgLNA++uQNmzSqu98NLKao1ajrogmvoWdx/20Kf2zBTXg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703152650_1530631720735_0.5827166410444007"},"_hasShrinkwrap":false},"0.5.1-20180703153611":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703153611","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"92aa440dac9b0ef4e1914c4c1b5acd81cfd36dd4","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703153611","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-bivi7hrwgPm1uA/eaEldtLajDNPPvdGf71ZFChr+4LwLxExqRZ75hGFTTaqdyoIYGkm8Kl1027GwZ/rCZVqSjg==","shasum":"41a2e600989ed95f815713fd7c0a125523bf9750","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703153611.tgz","fileCount":212,"unpackedSize":693399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO5iECRA9TVsSAnZWagAAtx4QAIY0DPQwq26MkInJhDkK\n7Qjk4dPcwSXp+mIK4Iq50ksakmfJxp8Tie193Egl3Qclzb4lr7C2nzG1qtfQ\nlfEZKfutUdfa87D1Pgi3b1BPpfEt8hwfeUVZ2rbDD7VI3NKD4sG2c3L3WmSL\nPoeuDWy56yrnJD/Ck33jNqJEuNZRPRDfzyHU6+4dPPLXwYqgG0XoxILCIDBZ\noQmWkAyOFXhXPDkafNGWd6laDHLK7MXJ7bhqvXwLaOY3vnrJhPEG4rShYu4G\nnLry2aPIVb1Z8N+TyL50jfd5duO6B3BV8tg9gBeH9ff8Vne78hcCXDxKR/AL\nkTc4EaasbL/nQyW+1jsobGBNuNTic5D6zAoPTGp73ELAP1ZCC7wj3c63X/UB\nMISef7ApLCmeS4a9F7yvISjmI9FnRyqlWKXOkdAaAdZarHvwS3tTtXvJiDAu\nyb+1aOlrh3minENzOGmn4USD7EizNUlOAPNZeT/fAShyPTKND6S90RnztcQa\n/S7XMB/jEtcIahFOZZeUR7kFUwPRWFJYPGvMndi6mbkHfMdChhzbFrsf2BeC\nIie1BUe2TTH5cC2FtMs7xxeq50NMBO7g/iwXl7N0Do1I/upr3/yWiFvhWcfR\nVIqY2pcSU53h3iTuylohrCucbhTCu9z9xG+67PJVK86kj72H62DA1cPUONdm\nyiRk\r\n=p/jH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBwuwh/K8iytOAF87Fzzqoy5gMvL77mwL6NzFhT/s180AiEAy2NHH3pOWEWqw6XJBh9bdYlI3I77ZLPM1a8pgdioCrc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703153611_1530632324179_0.30259306700001054"},"_hasShrinkwrap":false},"0.5.1-20180703154643":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703154643","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"83b62528d4fe012e4055a2d1f5cc7750c4d48623","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703154643","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-p2Nlvm10iE12VzHuKKWRjqoOsofvFp72XrIHx82ico85fZN8OwE44Bp5yqS3j5JhGrNzgokrMyOutmO8TGOpow==","shasum":"5a53356083294f57e846d9c15895272b5e897e33","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703154643.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO5tNCRA9TVsSAnZWagAAwuEP/iAIkUW7Q6XdP4W0tSKL\ne1t7JH5UsDc/7E54YxPGqWIcx3E5s6wgi+x15LeCz3e1TIbznZ/qj50Zg8Kr\nVRMucDt9A6JT6r3NdZPbbcbvBJNsUwV7TonzUcBmaR/54sc+ZYDdzXf4rSj0\nKYg+54iclua2PYJNt3zBWL00f/Rg4mW347zrDrNcrgCklzsDBb4+gk4yqMzw\nzpJxUCJdc0ae/gGSwiUOtXtQQIARSrfNoaCbXrvPa40UI3ITF37M0+qBV7LU\nMouqaP+r8UzrQ4bazsOBxMkzUKGGRBWa0V+M2fkSQS3ScGFmiIn3GYu9vv8C\nVpWTGmuz33mGRokvm6LV9+OgJvd7bQBVFbGxCx0WldFavvpemKXIgDyN3X/s\nhWbgD88E4sSIvCW4dEiGalR4eA6gaHgqsOX54YjwJmQV2iDaDZQAwjFUdSG1\nQAEU48bfFTFJk7o0x+X0CN6qxKa8UHA7EZhLv3+yePQ8CiQPkmyxKNziZv+3\n0NjWIDC6+/HrTsQUvdTIPIqPZNDGvYZw3Z/f505gRrw+yDe5SVpBn6FTp0Rt\nodeBgXVnoYli2wR3oikefTrPaRTrmtH2K5aemOFqHU1oPZxNI3RdgT8juuNZ\n8uOC+qIldMDYv2oC2dh42q3gHjH9h0ErmrB/EBTkekXzd+PGEvMwr76XAa4u\nWBqK\r\n=C7eY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFA35Bfaikrp5wX2UC0TsvKkqUty8szN2wLV4fbDaQtPAiAPOJAxi6lWb4SJStC68F0yRaQmBkHzeaq+cedQGuux6g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703154643_1530633037553_0.8766517382170205"},"_hasShrinkwrap":false},"0.5.1-20180703162809":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703162809","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"83b62528d4fe012e4055a2d1f5cc7750c4d48623","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703162809","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-it27d6fkGanGd5zhC9+TV27iYHrlmzJ4irYjZsiWpqONsGYSMjkImF0Q1+akBCdxYYr8yugjZZC+4WHdWS/jNA==","shasum":"021b83d65521da79ea749371812051d624dbfb96","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703162809.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO6S6CRA9TVsSAnZWagAAkVkQAInkAaYHAnTevYBSfSIS\n88zECu2eyYBidBDQ22jClrNBSLqYvLb9KTEXQzpOhWJXy3A9u8FQYm+uDftt\nPjtTbTBRx2LFBdoUxkXOJ4F1P3RTwjeuB18fkcCpUGoTFqmpQ7Mgy34OXqk0\n0AYa7KwYYLNnroXteHn1gVgFXB3FAn07N2GYforoosnsqXKrQsL6Zos4EmJ3\nXqSkyspQIBvgqY52xblmYXdWlaZB8q+ErxFhEhIyeRsbUBhM1iEeLlNdp0DN\n48WT4WjJohh17C1BeRwLU6heCoU5vUtAoX0VnXgCkHP6qDTGkTWRbcgmCQmX\n1ONSKD6EjpP4yI1w3KJHALS4kg4/VEAcJcnubBNHBC6SRCWODd+Psd813apf\n4llCCmhlPiR4yJvTbGL4R+g8Mvx3tG4EYQjpm4tbIhh7v4/bqIP3j0alGzsk\nvqkJO2hyjEW/QJQsxK9LJ2NIqJL5v1hoJKTtcmLFGUvElQ4rhoO8LjmPwoPS\nb4hUlPg2rAM3Y9gSEhHfvfbeB90ZtAQc2ccJ4/73Pz7cBTcp9Gezt/+UcAXB\nGvQJ3X1hwPc7rx7NuKn/OpHo6Ul5fcCkobbKqC2PFcroi82LnD3yMclugWmJ\nY5UvYIPEkrpBmcg+uhDwo2+fCIEk+blOq23ZWWyvTkv1vd6eq0u063Dmq0eI\nSTyU\r\n=YR2M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEX9wu7MSPKtRJJ026yXqd3tDdkWNopceCbzPDuQq5FQAiEA1p4Vds8usyEYOr7Tyzeqmq6vYQu4chKEUK4NdYB8ets="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703162809_1530635449782_0.6884592320707876"},"_hasShrinkwrap":false},"0.5.1-20180703163137":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703163137","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1bb164d7684c27832f59d902176319b9618391a9","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703163137","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-4rHMcM38AFo8eVFcmbIbc4qtx2YIsAwk++yg6Nb5x0UMHr1XX0a+/TNnKuQ1XqGVLwU6M7lbkb8BLC8KTiGhtw==","shasum":"6e3c3dda1ddca39b1c20c7420c7fc9267eb07523","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703163137.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO6XKCRA9TVsSAnZWagAA63IP/3cULllbEznWx1l/lI3S\nS0FejOZ+0ytfgagGXOuUXQb1Qc6dM6bpJXOj/XSQdb/r9uPXeLEgIwMtEnnP\nWtH1kE1911hAl1PO3nO47ttNuwzXf+CCz414wi7RBuyoA7kI4xK6c1uHeM5C\nYyQgdvDIuhhUUhM83MTQ/GHfg0acPuhxoLNo4y7MGe0LHpB4JbUH1Ki6AEtc\nfe2v0f8fCBaxO+rYtsytVlyNGaHZNJQK4hEJjt+0XxavKg+cZVAKiMa6KS+J\nTyMvvBH6D9fow29D3gpnhdA3AyayfGMimFGWmw2oINaOJwODEvhtDDj13eJD\noBTt7XyHLuNZikpjlFAwV5FSvrkS9ASBhZ0/+0zPizYUOmVVyirsgBCjH1rQ\nFBOzxF1qAyS035VnMg3PRtcTLiOrmDQXzfeRp1/CYrQsl6eCn2tB+EI/Zsqs\ntbeM92wWt1anW1FdzTLIUD8Q0lD6DRVs1husIXdqWCg7/MNdc9Pgm9XreGmz\nOmB3lANvtaHWRWs6Bb915wRC58MBj1otxv0cDhk+b0RDz84TQytCsAWXCoP4\nwEhgxsLMJmN5bc4jMNtCuValaQf07/f9bbR0FfO8bNs6QxYfTBtiOsqcKQnj\n7c6BOCIXIFZQLtWHzb7SpLTE6tXADUJdKIsDEFvU+gH/My9FCXI+1UYHBMmN\n34eL\r\n=RD2o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB9ckVZ6ymCzZosEELGhEnFuoOk+VG0PPhieUaiyY2j1AiB577KWijCJzsnGRFeKkiEQ7en/dkNvzFwq3IzNbM292w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703163137_1530635721980_0.26066549303666053"},"_hasShrinkwrap":false},"0.5.1-20180703191412":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703191412","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1bb164d7684c27832f59d902176319b9618391a9","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703191412","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-4RY0w7RmHMW6T/b1wKdNgEfWnkA/HaCi34EJoy/QM+PqdMkiNFKnxIFhXVKKAFR115EXu+kgQQeNiBttNBgqlw==","shasum":"0db4eaa08af7d582b11747c60a3a805eefa209ef","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703191412.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO8vPCRA9TVsSAnZWagAAhpwP/j/GHaZFArwMqms92oN8\nwsONo/FBJ56IRep1SwhKHXC58wO3LCRt87gI5A3gN0+BinneXwQdcT6PoIJY\nroWzRMEk50tAsTremBziq3g0dSHIX9pwD6+0N3AS7BDd6hg3yHUb5BT3dZAN\n+X61icEc2XBKzw1HeKjA7cs4OFSUj+whG4zj/s+GNbfGCwJ+SCGljMNl7Brm\ngHepp2s8MchH14mBmi2ogYiU5Cqoy7mKu8zqe1lJp1m6tWgmWCvFNhQk/H9w\nRHmtYXTVkKLyMOq0OvCRS8XsYB/7QQAsPErFSHFjgsgL21ydpBLkXr3M6VcG\ns/pPWjyynOvv1kHmReREyslxGn9dMDyWYBEP9of0q2jFBWwkXj3d7RtTYpMk\nyYMr2xyrZ7XOfWAYFkGjrwvTpwJ6ILtfYauj2fi4XisRuWehttbRSwV7YHhx\nvRRrKHdlmJd8Yur+GrvDH7NoWA9VMgLMCsMGc5mMP5Xz7EYXtYWLJ3HsYMg0\nTfftW37QSMnjbhmJfVY+jYOcj1ncM+2ftztUQ1zqIkB05PgxA16z8jGPFIbG\nFyka2uhllqU1ntLZutDoCsvfLnLMroRZ4rpsyXD8TUeXVu8k5A3hoqfYf6Wa\nnGbjdvzcE+voty9F4GoAMaVOXOxcZpUzxyE9P+k/R9STzQ7nKeMO542sV1Nt\nEBjf\r\n=Q09x\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAJ2YWA8jPCimQ4BOMJeLN6IaPpOdl3VGZAZnhsV1x86AiEA0ynJwRZ1ZVPi1T2+m0lTFD/FJWB+UTGbDq8huYHdGJM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703191412_1530645455599_0.0003375745828373411"},"_hasShrinkwrap":false},"0.5.1-20180703192322":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703192322","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1bb164d7684c27832f59d902176319b9618391a9","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703192322","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ITqwS/+tWezDPPhMmlR/AIYcGMf/WW2w5vMfWQXbLJj0z8D/uUuJP2alPFmFKa/+qmkrKarDkUYhfLHvR/y3bg==","shasum":"55cbd271b19b964732fb54cb5595ea72194ed1f0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703192322.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO83pCRA9TVsSAnZWagAAX+AP/i6fddPDGKj4J5IPc8La\nzbcjIgFi3dj23wXTJjwuvfum5MuRDp+BmbZDQeR8k/cB+q8YT0I6dL1ZhEF0\nHqGgojxpjSkBJhis/BHYi0U5IO7UPtSLCo/9O3VQZs8NVb+g7sSv8gd36Wyz\nW13FLGgms4nGxefMOWSix/eagG3KBV8lLs/IjcNoTi300oYve7KoCsqPSMeo\nBNDe068gDQoywvGVVYNPyRACqUzPnMGUhE3dJD6snmOW0iwsZCDuO1HBCmGq\n8BaLGb6sNqNLdQcIAuJoKFNF9K6zSdtaR1m5bPmdBnH+jNKG6Iiz0VDtcM1x\nOGH+FKRQZ/0KOfP5EAukb5Fzn18aFVq4bILpngarkVNUDK0Dba0G2GYkOW3R\n6+y2bolDYKNBJZYDFT9jgfORYXt3niIFz1/nUY/AQGUsb4wpcxoUYMVfxrGS\ntErfFrbqE/+5+YrF62dlv1VDo5xSuamloL2yPlkrbNpiAYUlKZHIW+X5MP/V\nUGZgbEOkSRgTToX+d6S+H6o22+69ZC2akTzzizrfTY9pIEPQ1NUJpGYV24Q0\nydA8KrtZshjctPxhYjI2FA9ISHKKOHKW/SWNMT3OntqRLE83eonqCmMaI/t6\nqDoPC4ooS3oYrxdPI18WRolhdPYLvPsD6pvnskRlAng3m3jK6Xg6VNLaoRIH\nbeQC\r\n=99PZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFJ1paxGrU/wfXgIuiksxcLjW/X7iBdWW9lQGl7LoOleAiAe7TH0Sf2x5iJgM0Hh6M+yWEQkqi1OeYB6WdHr9ponnA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703192322_1530645992955_0.5013530226567862"},"_hasShrinkwrap":false},"0.5.1-20180703192637":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703192637","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9cede489ff95722a0cde8992a4ece45b1c4a4e80","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703192637","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-hKd/VeGganBkSWJDA4W/EFaxCzI84ITcaB85XnIvzfaa6NyzdyvIvLY81G7TMzdVyy/9jEig/KQsbpS9AWVLqA==","shasum":"681ea4a983b0d84068ad84d675eec8cfda6c1f67","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703192637.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO86tCRA9TVsSAnZWagAAlUUP/0m1+kMXBYaiZBvD8E3N\nh4J+1SqKYO5c19Fz9EXBVjbBt06IDrgqUSGT05tKRNtJUxLmh4IBfMEfhvNR\nKJpvmVM3Za9x2md0IcQ8Ufd9MVuZJAVm8f3dOXL946vWdvDcbwKF8eSlEHxI\nT97CZF2zOHWLhhyPrWBCiVjBKwId0IL2sdwsgKF55BcwilCcn/K1tmJ/rh5B\nfxjIG9VjUGRGYIQr+W2oZqz0W75AVVDMwrD5UAbeP+gzHwrQ9Ettc1Tb8a7S\nJzp8A4TrHdNkCBMb/eyUMZxhAxtZt/IlU8jqDDsHraPTc9kewn8snUUa0YhZ\n2wQl80jllem1D2E7WQIx71vQSgejXWPSnr3JM27MEx5B5eRVAMoCPErI1s5I\nOLeLCge6mnhIn21ZtK1WOj4khXVTa50hvMVZCpq5IcymwqZsXXjdqCur8L/n\noLW9Mg1jy3nJb3SfXi67yWbo6QhGbp9IYk9mpFS0F1c9KeehhoK/3ISRi0KK\nGe+YmYcu+5LiXqj88joQOeFaj/JQ2Q3vfCUI8+nHHJ/0rXFrXU9upuof1LGJ\ncpbbI2bK7bxo+GCjfaZj5IaijGvVXHot9djJuf1PYPk3VdP25ecQCo1RvJrx\nqyby3/2IbZA7eEG9ae4ol3x9cIqGcWB0Y8rtkmFo23UVacBGkazjDJOo14EC\nPDQ8\r\n=lX0G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIChlhqDkiX//khD9ds68qCEiBS1qadcYu+DUe2rGR2SlAiEAm/0D/MnQuSrqM0qvoHM3Uh6urUf7DuMGX6gtje2QBCI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703192637_1530646189627_0.29344836381215056"},"_hasShrinkwrap":false},"0.5.1-20180703201232":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703201232","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9cede489ff95722a0cde8992a4ece45b1c4a4e80","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703201232","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-UlZHq3Kw6IDoNO7RFmX8nuVOg8Dm0OrLYQJQ6WRHLHOlJzNaQJrir38FJV1+Kxb0vLDla6dJ3dwTJVEczjI9WA==","shasum":"5502918d6d249f6f3bcdb937ae109edb9685d28c","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703201232.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO9jxCRA9TVsSAnZWagAAutUP/ihUnPDv0N4/9yTnHdIP\nt9vduHqIBxw1JtNVZ9K152cOfEDD8rmACl7JmUxxqimuQF/R3qo0sfbtz+CN\nEML2xHQxy3TbVW5n07+KDFW/DBQ27Rkj94VxdVE5/I5OjiLG6wOO5QNvOIrT\n3YzPDziB7QSw/scTeHpFwtFEsLAAOseyQIAH3h2AbPxt/NlfwB+OQY4jYqMl\nE/N6ATEg5U9RNT7KUO3ZkovEH9kBghyP4to2t6fzsoCejdhuV+w6xpZ6ludQ\nZzJ22PLmYdff8zPGk96XLYat+ud4fHybFwQEX/iKhaY9nLlAAZfRl7F8kw7G\npHlr0wRaESTvyETA2j2i7esZeDFXWdryU+G2BhAMmYWMAYMKUgt2YGCH/zyC\nlmKK/XGF6cFi8KwM6jN/MAi7qlOrrt0qwGffTcknHdynNaMyzqCTNVKqyunQ\nzd0WRLlOTBk3EzYJkLuOwruNGn4wcXGVxL1RoNmo0VbEXxg/eKZ8kS/RxhJC\nQVsAXi2V+JQC55QezCKqPA7c7y9pAYTEOTRs6scsoE8h7cVgArdG5hgM85l/\nbItX+WrMjn6OE4woWF+FJMJCpYPBvgRRqqX28X9RnFZ0tRr4OgIB5ln79hLm\nG6q1VCLqbhSd5p/WCvVjjoYakjAD00p6UD89nc0d5j30ziq1CadvWgXn8SxU\nK3sR\r\n=wOFx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3E6f9jc0xx6ije/zBGzvCzHqr2slkzrPg0YUigLL9FQIgXtlEpUEskkMmVb65M5RXWZsrcWX5Pje41ntk5hBxuAI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703201232_1530648817319_0.8698861166601448"},"_hasShrinkwrap":false},"0.5.1-20180703201910":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703201910","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9cede489ff95722a0cde8992a4ece45b1c4a4e80","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703201910","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rmlU8w5Jn31jsjl2lGFzlfy+eKzW4tLg9A3dZ2hSxx/5MCi9E6bGyu3YOjRwwRD0gMJ/+CUQoynAOM2B4D8QQg==","shasum":"d2e4bef09f57e36a408f91e342d719d19a47eee0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703201910.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO9sSCRA9TVsSAnZWagAAgnMP/2M2KgkiteoVsr83QNX7\ndHJ2MN+6w66v+2RvVQmLKoLEHpjyCTMXYf5lWCeifMikNF/DtIdr1lTU+Z1f\ndAICEXTeM6PhBIrespn8dt4fy24MtepdAoxtCyrBHtSp8r+8cStgXU2wbUEr\n5oiF/9nSyODqrhy0m0tOsqw8El4elLblvh3FceDYYJrAGLgkJ+zHUGyZ8PzN\nODOHDGDQBhm3pahmQfiR0TlQ/yxgQ7d2l8S8p95ekSGd9yeBOWNNF6nTRXmY\naNwkelgS4M8HPDJz16OsamDjlnQXnvYyx+VrGIlpFgH6Gj5MunHBNiktaCoO\nAV1VsqU8bzBPJDGbXyWg5yeKNc/vptO7z/n3oU1md8xgo//vKrGxUXBPef4V\nadM2AUZCrYY+7dyXlUE3h2HzXBPpIM2k/k23tA9am5MRa+ILkPCBGhzp4QPP\nP6v44HQPPRqZAc50WTfKztBODRS9JufBJFYh6ouFYeR6cUkLzP2meU5gaVrN\n7GkJhJRV+WCoIAIOqxKcBCfPahwp1eY52Kdys5Q2V9fwYRfFIrqvMGAgFDXW\n/pyOB1FAmfdFDoSkpjywlfkvf43GtkK6tTDUnZwUwmxS+daVEJmSzAiuqyr0\nqnpbG9jGuRGsJ6tzR0gKSDihTw2Gk0oE9Ia+DaGQi6ccGMSDWJkVbgUgR/Wg\nWH/3\r\n=yj5j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkcbOZ+1VHzNS2qB1cDHE9kylauV/GtB4Zm8DvirZxVAIgfdtjmaeGfbPhaJ2MOgYsz0o2tdMtKYxfR+DmpLbE7Iw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703201910_1530649362452_0.5401883934446972"},"_hasShrinkwrap":false},"0.5.1-20180703215047":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703215047","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9cede489ff95722a0cde8992a4ece45b1c4a4e80","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703215047","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-3dLgF9/1uoB0WSDKIcCqEZsPW3RYQ/+j9VbnoYgfnIZdvjCn2Qi4Xqz9IerCf6q++qfociA22NUU/Sehc4pzsA==","shasum":"ce7ad392ec4073c304079bd889d02db8a3bb77a9","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703215047.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO/CfCRA9TVsSAnZWagAAaEkP/jeXJjGllyh5MoMg8jkO\no1QIm3+mCbRBA25NK6mXxbxP2GeCXeKwUhL4WjmczbaHKJKQs7PZu0LfPPTA\nzgofLxftQNUHnORbvj+pngqOiKaU48h9p3GU8RXPRT0L56GUj5QPlZbt4LfJ\ncGea7RLMbqV7MihzRMDcLKbmU2qQlrNdjZWFNqhKwcDO8B2nA0/x6B1u/6EO\n1KdjOGWibIDacY/fuQhmDCJv8ZXPMcxMuazd3s1ZRxvPstpg3IhSa1AP5Hqx\nvqPOYSDj409Zptw3AFPO4ouAMgN9/P82LBJ5gfeekevLxlt5GOmt4jHfYwNR\nrYYUXOZRHI9h091R1Jb8gD2kPNzk5JlCga/veHAvg//Beii03pIN3uOd71OC\nFSBC86nRrPJkDXkvAIvgAHN5jHFEvG2fs2UXQGur1k2a4L2JL3A3rWp5E+gf\nZewboRoWqm6r444q16CTtt+Am/E9lmgSI/gF0MWt/qAtIiwXpChk6+9hOJfn\nZYnUas5QeTUAXJai45iNzy6ERrQM/92+KIveVTucY9HEKh0dIPUWI03ED5Qf\nxRXkwPv1M7RttxxoYFVt/RZ9oJwn6JGQwogaB7xblV+o58PyXpFUcaAZDAR0\nI6mijz2kLKzUvP36qsK7oGeGccyAmZPuoAxgO3FPM5hjk1XeNJtphn0zDuZF\nbiIX\r\n=cFgD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEJraArw35M+Zp2RGwscJmmMBg5lUMa09067hInlwH8/AiEAnEUnUT4W4mI0oBkKuxGbuI9+QnHX/7TY2/VHh/zmfgk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703215047_1530654879735_0.2829679196831507"},"_hasShrinkwrap":false},"0.5.1-20180703225640":{"name":"@atomist/sample-sdm","version":"0.5.1-20180703225640","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2248571156","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9cede489ff95722a0cde8992a4ece45b1c4a4e80","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180703225640","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-2lvNIkqeK/baxxCKK/HAtvp2rn8LOMQVGa9gAdRqZo7VKhJFnfzJxKvnNVlqgxjQC9lVHCavUokOL9FfCF7zgQ==","shasum":"a5a8dfb71a17cf2f0ba5216811b0cb900ee86f54","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180703225640.tgz","fileCount":212,"unpackedSize":694031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO//wCRA9TVsSAnZWagAAOiMP/RZzLMQkcUSPgsgDF2H0\nYU+2Y7W87xEoGVDZYRGgRHQfmv1AfQHGfGU5I3UeMjI8QR5Np20RvU05tIXk\nqkPDq9AODRhKVVY61M2fY/UXX5eIFfW+Ez4pfZJytnS9UFasw9YprQTWjAss\n+VULF2wFGFvnRhmIzKtRtuAoTk3mwNQAcPOfKRAmrJODkRilXZKTkbLg9FLq\nbQZJqsXpi869rkMWm7cl4c0THllLUKul0UMP0FdA9kYE2Enyp5nsDRlAtups\n96Jbxjdlb+J2d+lyP9T65b7TArwqVXytxqB+1aQ5drXFaGLRXW8i4VDuS4Kq\nr4STR6eaSemkX42x2GeCV5jaSwZtJZ8bY7KZw1ao3RbGw072461HjmscMDqb\nyHteEHaIDhSupCKZ2ppTht1VOtp+vvcpwR+gBIfMtKgSKcDrkY6KZH2u//sz\nt2z7yVzobCEnRn4TjOGDWm3Kkz6PV2Cjk9ZJWiic3hvTP/QUQdjTbzxl+7EM\nVH7MEWk24iWr1yMVYpSd+MSMWWPybBck+6LXtQutuU3Rp4PHhCGrA40UdlXf\nORjPdJaPtyVBtqwi+VhIsbl3DDtiw2zyc2ec0n+EZm/gV9fFf6RxrPMZFIOH\noWHEKxPkFzMFJR1X7UFNdBvrCKDkvWoTy7VwbDXy/0APakl0Ri9g5xUJT2Tj\nKh2s\r\n=50+3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQ1owN2xzBoiWzAsnlbc/o97S/hYc+FE5mFmkLHfMwPwIgBLAGL1jOiNyWDDvY4xqapRpkYuLKEI5YSmdDvb0w61I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180703225640_1530658800482_0.3665742137596679"},"_hasShrinkwrap":false},"0.5.1-sdm-update.20180704022934":{"name":"@atomist/sample-sdm","version":"0.5.1-sdm-update.20180704022934","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/3875109095","@atomist/sdm-core":"0.3.2-20180629161944","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3223ac5482bb3844957da2b927f877db1b9f7411","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-sdm-update.20180704022934","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-FC6XcUKkjeq9wVOz8ZsQOkUPULUBMueAGlQpdF18mu0fO5nI5dp28+Q2NEg62lAUY6Gg+ezhKMJf4bdGRgqA9A==","shasum":"2d8d4487b1f902231530a31b966b498eaaf31537","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-sdm-update.20180704022934.tgz","fileCount":212,"unpackedSize":665970,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPDG5CRA9TVsSAnZWagAA/CYP/3LqH99vbpDHJTdvSSkj\nh3iba4tZBKaidfH/SveS6okaKKPWTqpbfMvN9Hgx7zuHlMcOAu+sabFWK7tR\nn6UD+HSASuMsEjDy6/WZhYVa4+KlOD+0GMbQL7x1pDzMjiC1h8Ea53HcCYyx\nz1AGmU2QPIxgoGmjrNNrvEfpvO/Idv9ffNHSq7H3sN6hY+hryUK4h2fS+LVQ\nU/PHaq/lhCHjJHEDj//pNg71tq7cEjEjhIv+hQQmaqgblQbxhz2+kXM6E6SH\ne4F4qI7pZjY70cy/yGVsXg/VWMdrj+jESJEdqXmtdaDbWOOvECrJbISas8Rm\noQHIhdX84/SAgDI6AM4WbPt4iABx/GVi91C59M9GksEtvj341vLYF0d4/cP1\nTm5vUt7WD9NR1urGpjVvxbwSAC8zN1IZrJ5iQQYOA2w3CaY+VNmcJC2w0Q5Z\nnIA7MB+m4ipxJtoSS8zF1Y4EcIYg/sIpKRdMHWYr8w/CFthqnFFmnDWGj32L\n4Ik66yI+nyKWw8WkmMcVgkyeYzhkQC/t1HHaNXQ1Ygtm7MglhB5FFs5jpVo5\nOjUUu7T4Ht1TsjryixvoAj4Skg8XaO2fNbY+2oXidHoPlrDj08F11TkaH7S0\nTtJ0qjMg2C1+LzyBb8YwdYXWNyqLDNIscocC8wIi8Q/qXrF0/SWfe8eogQbL\naPoQ\r\n=ynKk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDuRFxGQb9A8Egw+LbgxFEAJ5s++rB3OoOzTk+CTcovUAiEAuEwotoAJ2ZZIZXtPPqxk7Kc+kWMSrQWVEzl7/YSfXLA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-sdm-update.20180704022934_1530671545441_0.12211430023783998"},"_hasShrinkwrap":false},"0.5.1-compose.20180704075804":{"name":"@atomist/sample-sdm","version":"0.5.1-compose.20180704075804","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/1424310865","@atomist/sdm-core":"https://r.atomist.com/1387347290","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"14ae8094a6668460a5f198566beac74910555db8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-compose.20180704075804","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-98IY9rBzU0Z1QTbEYY375wFVY+maosXbopRRIC+ZQsrOKCEJRSR/SxYlO7ugwKC+jvIsbildsvUAWahAFc5MuQ==","shasum":"e9bf1f68b27cab35c4056022aed72af06c591e01","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-compose.20180704075804.tgz","fileCount":209,"unpackedSize":665337,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPH67CRA9TVsSAnZWagAAk9kP/REyJO5UThKCYbSMkFle\nSLJWmUYMlWk7XQDSQm9CU7jERK586kU3TtW9Dh1DEoRcxVWYl175koiaZVvG\nElmhFPl4Th/UkimWglzMQRYvY7eAUl5dLtIf9kYZud+J2aZw+MFt2Nkh7ArH\n+uhs0KtO4/gzWCtyLtezpD+jfqlS9MG+obk/u81hOGYkUcGpO55AnbTu4dQZ\n95iwTflrYI2l8TFIAxtmXu9ihBaxPqUDYZk2bmOv+9j29Gd18yCSImy6nTL0\n5rpZ3pn0Sgit1tiegReuCMDV2TqWJPTnsWNSoEA4j6UjJiDI1W+LdekA5RNU\njl0N6yNi8c0TqVflMWjdfT/VvzVCSKXQ236RKos20BRUsAX640+VKsl2ZXio\nP7/rQGFMB4pWB8tQA1zyhK+NvzpHADFnzSogOM2Har1tt1K5CnEvWGoXsP4u\nfm23mF/TLP8Q7nHRib/QEGoXl84tV+IJ3ASNYabujBT3JvmG21jNILyOol9J\nKMiwQJPn88WaTpyGQLEb/C6Z1wAV82ZlCU83AOhdcSFkiyh9KGhH3hwGokFo\nHEGY7x3Q5SmKWpcrAh5hgDpOmFTfvHT1U4vjFW5aBNTl3RwWtkwMWLgLryI2\n6WVee+fswHdtbpuQ28sOBxnCitARtV4njJWJpIwFCEXQ1jhSENrSw82BwFdn\n71nm\r\n=9Pl7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHoDMixzLa5j4OZyx8xt+D1/TYAaUzFo5jEfnW4arucLAiEAgW4FQoY4LLKpMe9h9OcV79INU6BUD1TGsRotf+rKcSw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-compose.20180704075804_1530691259110_0.35556995451720885"},"_hasShrinkwrap":false},"0.5.1-compose.20180704080653":{"name":"@atomist/sample-sdm","version":"0.5.1-compose.20180704080653","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/1424310865","@atomist/sdm-core":"https://r.atomist.com/1387347290","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7ae568f38d35e6850dba446fe168121dd3ee2fd5","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-compose.20180704080653","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-BVAMV1WeyqJmiQbw1tHM1N0ghZyMpbTMNyopD4pqGiXRG5nJA1VR0k31Xg9j3mH+cyCBy9F5l1Vdf1hpJOV7ug==","shasum":"38c64609a3a4bb40b775c92a1f4c3037f8160927","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-compose.20180704080653.tgz","fileCount":209,"unpackedSize":665337,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPIC1CRA9TVsSAnZWagAArvUP/0IIS65ZdTHqOirnsrT8\nyu6VqwttRxmsmUStcpfj8/x6QCTDpAT+6p656Qk4tFWUIF9o7txlMUg2cwx0\nwUQgWNBx0xAnQ5niEmbEwLf4+NHJ8mik4Ez7NPnSjUWcvnQpUq+CYiifukyT\nTHKkDJQFtyQ6jsx39Bq6kmNODySLUvmURZFMSOy27G0faRvq5OgEGvgVp4It\nRdrNTtBwGZXDXBTZvWvHKiu/8gPj6OrSeFKO/deDPbJx8S1+FlFup1QB5NdB\n8rXs+0jF0qXsGSNlKQ3lqRYvruVXknqzliVFLv8YdwsFmerZWBtuDYcTb+gY\nMWnQRcllazEZ1UbVHdMOpShzFd2BPxH9i++Muayk/432iXFgPSJVHCCVnFz9\nLV+q8sXbZRSs7qSKp7M3S0P9X3ddISE4eXKhjyA8e2z8YFnEIBYDXu4wzxlR\nbz25U0OnvF+9JIxKCBe3P+PnFINcYnYG6tQ/sTeHXeTtp8LAqE2Oej5f9WJ8\niU6BGrRTnSjfACNPB822Qr5USEp1B8NpFTfK5mHN5GBUjEBmjmwIQlq/6Qi3\noCJpJOA9Q80QPG1NJaVkkjpaCO6IS/6V5gXzYgLGAgg7tqrGBDOragWwMSON\nhFWDl5paqEJCIgrpbSqRLNrt3hsV2zzDyiaBkQkly13TuPx36PTjGNL0jmaY\nHvgR\r\n=sv+p\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHupvlBCoLxSVfUAKoQmNiEbsnVZBWCQpS8Z3zMMV34zAiAPOb1RNG8JybH0+1sdGbC3zVvG7m0twhIToGvL5b7mTg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-compose.20180704080653_1530691765377_0.8986883968998698"},"_hasShrinkwrap":false},"0.5.1-20180704090100":{"name":"@atomist/sample-sdm","version":"0.5.1-20180704090100","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/1424310865","@atomist/sdm-core":"https://r.atomist.com/1387347290","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1265bf09f6f1f85713fb9cdadf4f946b11bbb1e3","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180704090100","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZPI9FcFrZI2P8nzDtNM6jx2jN+1Km/NbsxJP+z/rC1J8QG7v+oWPnXJsdftBUUThfFS/AY/K3LYs16jdJBOLSQ==","shasum":"9b7f7bca1e9142330e18bbe23fbdd1b6fdec97bd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180704090100.tgz","fileCount":209,"unpackedSize":665329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPI1jCRA9TVsSAnZWagAArrAQAJXYw2NK8ZQhJIb2y3AQ\n7GBHheMiJDKEObhf+luBbxzg1r//7W2uRnV9Fz+aKba/o6YcxFsygDd34m+6\nzCuzZYBl7axUjiqo/VF+oVru47wn5gUJGHgaewY7diYN4rPLBV/czXxSlADn\n8qnPWOZypfLw7ZAlj+AZC63PNoHptGYNY377Bnue2gqp0xVU5WBXzITEnABs\nZwOraNrrMiGc+DPpbkcnCXgjOLk2JBaMxJHI/wM36MgYnwYT0/w3Ysic0Gjc\nDEUyv1UICTxyrjPmmmxuh9cfhaE4Wh57jJLSj+kkDtK/PkK/xecfvEcfiNxC\nemP5YZuoV9K1QS4iXe0C7xfdf+6jBClUpbQLkGg5iZXFAhDyXv+rTPIDySFC\ntxWZUvxR9poPc/F/rQWFbG2LrGZaX961Z+A2D/+Vaeb3VCTGELtyHbTdULu/\nVjftZifx1NFzOKw9CSdNb8pp3KAp5IFhgd0r80e5hX08mSJGLrX9Y5Pt/OQ7\nekF87oEoGdj1s/O4k0lSlT+v4AxLl+cVJMcAWUpINB/iscOs4AwojqRfi5oC\nTJ23ynlyxthNu47qFUBuEGkRSJiAyLsTonaKH1hmGXBbn1ktLSl1QFGcDGlx\ndl1oAL2rZGXV4OysR07L8V1nBunAYTVO6Dz/5x1jHLVHKYNhaeznR7dlqTsj\nj0G3\r\n=XI5n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOGqxzyN/+TmDx9rgT9EWH0DoRO3HoLseLTTdfblZIyQIhAPzyhphLX+W5j8KIok9sfBeGrPVdc7k5+RCZQLT9uKFX"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180704090100_1530695011134_0.6625210636858379"},"_hasShrinkwrap":false},"0.5.1-20180705000149":{"name":"@atomist/sample-sdm","version":"0.5.1-20180705000149","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm":"^0.3.1-20180704121313","@atomist/sdm-core":"^0.3.2-20180704132626","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"a2c41d0b4ae23a5bbd6eae10102b9db4e7fced01","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180705000149","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ljStKbKXQRYmYUAaiKc+t55zl04+LQt8PTfJwZDoQ8bOIt8cZ2M7xnugz5r3/X0nPTZhghKiLRUNGeg/RXsECg==","shasum":"7770f82b0c8cc0ad1daee8b9158c052993cc8b0e","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180705000149.tgz","fileCount":209,"unpackedSize":629735,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPWCICRA9TVsSAnZWagAAnFAQAIIl+1G7KN7qg9CBTGF2\nq0Gt1AIKkabJaCGvezwwQL0irN37v215gzRQK1d1kFaV16ivHAYYPOkEWxtL\nLRIjlODiZOltM4whv4Stp4nL6gj/xJw3L5cXXGHC8KJdcMwloPcY3PIhuCll\nr7mKj1CWa9TJ/YaBO7buV+Ccfli/AMV609mmcqq90BoZKuHw4J61IxfOdK70\npl3gQxCst1X5LJET6UaBblrpMjKyq44v/37daeI9AsyzoJwY3ikEIzy+JLNd\nJoNGSH9lPLg9ofLENtT1SKBl7Br3VD/BIIt+HvMkBuc2Y5dTZ9/xE3l0pyVT\naOMF70+rF6EnFoJmHgEayUmO3Y5zMg+BFy+18Qo19VFCuDo3RMGr3SSrwKFN\npbMtwznOJSnJELwzXVE/o4SP7rQdT3xvoQEaYjz0H77joxLUrazHOMGx+7dn\nRm2Q1q9yp3uXvGmrTZNlTyGQpyGlw7lS05p777+qgoqAaAIwIVNDXiB8sOdp\nd9qY0PhemLe5/0zh4yryK0EVJmCj8Cai4kssZIbmSly0Hl3wM8Tx6pqrUg0t\nBeWoauq3DlR87CM2UApO8ZhABmTrzUAE2Yqw6F57KWt3olg5K7xGU9sXoVpU\nCN/A0H+M1W7MKgPsFfUWkpf0qWxZOUcLZMoR8U9W599EzBwSJq3oAAplCAWP\nNt0x\r\n=iPK/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQ5M5e9v5RsC6FPSYJT/V7ENlWPtryIs6GA+flyWBmbQIhAOxSvd/P6lNRyMOZ0+c3YRzB9jQI3TCI2A4RnHi7iwAV"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180705000149_1530749063859_0.3089113210056851"},"_hasShrinkwrap":false},"0.5.1-20180705012256":{"name":"@atomist/sample-sdm","version":"0.5.1-20180705012256","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm":"^0.3.1-code-transform-registerable.20180705002613","@atomist/sdm-core":"^0.3.2-20180704132626","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"78b3b2675f8e3e874e89b642fcb1c79f687ea080","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180705012256","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZnrUw21I5u17WR1g4X/FLKNsvyYSaloj4eh0DjuIm6wT6BQwARcWo1i+xX7xqyreYcN7Dj0GjipSxXM+fn4tFw==","shasum":"ce4c67a5a42dfc7be70b94f9bc8efb0c7b57770b","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180705012256.tgz","fileCount":209,"unpackedSize":629962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPXOmCRA9TVsSAnZWagAAkeQP/RuTQKMdEAnAQgYmqOXh\nIgTYMXnTfKSV9e45POboLMTXian+vl7jYu3ws/95m5C0/ZVaA6Sz84Y1425q\ndy5r/xMKVt/jY8gVBBLjfxrbFt4ZKInX246duYfBT47XJkcDC9B3XnVdVVGv\nSROksgRQ5kiPJqEtctljBq23ErBFlIPYUifrdtXW7Nut4Rd9l49dOefEhXXQ\nVLC45f5x+UriOFSebsoBgOmYiEI8g5cgJOXvK1ZaFq8TzlQf+U14R67q/npq\npUSGrdGLhAa7fPuky1yoxDXmT55N788TVkLIRnXDQAsMqD8eCg/TijM4GvzD\n3jD6LbsLYXH9digazUM/u80x5LpxWwAa4qwdF3eDbUUtqLmabh06GPSuUTH5\njWvXO/cgM52yJF37hzj94HOwwzbzj7HCjT+Qa4b9jLdnCQKqV4QO5jKN6E2H\nY+mPIXZ7Jd5vHiv1APEKTbzKOi7WgAlxA/JbKNoSwsr5rHYeNGXjV1xXcupC\noCtDSHGgEupU0MfHLbSJ/MBSPNi6w0vVxxD+QBr938N1ANocMT1zkalF0s6n\nYo6fwFkKjBvmv7W7cDTGfQKAYYoBbi0UmVDjhqyqHb8nILn5qlDZIzZ7ZfvE\ndj5uYk4/bfm/4bmJcAH40bn00/9wFOEvgcSbbrG0oSstGBBDMkfugQLmBn6I\neaiK\r\n=I9Hm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICfgfOVFGzZjGTKhjwthVSYXa5cNDT137wfcpZKcUetuAiEAmnK8n/W9t2swXQAyubOrNzaMEBK6NH6LVLHKCl+1Qvs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180705012256_1530753958636_0.9668045039327557"},"_hasShrinkwrap":false},"0.5.1-20180705040834":{"name":"@atomist/sample-sdm","version":"0.5.1-20180705040834","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm":"^0.3.1-code-transform-registerable.20180705002613","@atomist/sdm-core":"^0.3.2-20180704132626","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"78b3b2675f8e3e874e89b642fcb1c79f687ea080","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180705040834","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7pON5vcmYSl3U9lkklCfXQmGYywMxubPCvDlNIq+32ETkOZUKUT2MW/l3wIzlkh5/zlP/IrJfdXuyYBFSiDFJQ==","shasum":"b4ef4ce28a4d7cff42d4255f22c8992ca5fe3ce6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180705040834.tgz","fileCount":209,"unpackedSize":629962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPZprCRA9TVsSAnZWagAA9lgP+gLWrZz1C2GyS8iRS1Mh\nTn9KZxfVEuiTkWUHfBjzntQs8n1/lRYUaxTEdTbreCcwcZ3Vq4EnRpoZu9bE\n3my5UEduCW+w+hWw+eBFENYAG1HfVlmogyfOqjkff/nT27T9fN7j893E9oks\nwzj+9BymYOn6aFjvzXzXz6X5feynLXdR0zGmfN4PMnzKWx4IYlWQmUqPslJM\nEQryZpIbYBKwS9+VA5LwPhzavcq9fRf8aQN57lwWlINZsTtGX6DANNvcL4NS\nWD3396sqrWyGjSSwChbty7Or6MLsJzK+5t7ol4RzKZA8wbjgmVVPaiQJpvJA\n5KqvM8i5e0vK6Iz0cmp+HHqs9LW4X6VLNWbmCHAAjtWvU+6O88c0fFWwZ9G9\nrUt/crXeIkiM0HbXlijBeD15OIYchaSAgj4DbG7jRRzdV1/ceUdhVJ550LHj\nY3kwKJZ2o0TY0xQbFGqQ6SDns9+17QG0usxtFDu3CPTYN2QZ/xRIeFMhmdoY\nJ24Jc/GnP1kU+2wD2ygADwQ4yLjZiHPnxjAGmhYpxpgIdvPL+j0gh7tSLOpx\nJn0mfjsq+27hCaUnYIRqSIj3GYFIW8iJJD3J6PIoaw1OAf6D8NUTiXZhjl1J\nCBBXPLi3Q5Ct1xoFvVeQNL5Dc+T9W6sn7J57exuHkLUGAvPDxPl+ot9BDqpQ\nlsg3\r\n=eHFX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDtePH49yVhaaww4WWPAPcCHepC13/hYFYhO4wkI/OsEAiEAxl7hCj5yABl3tFEJ0jTOChRfcuKm3hdq0cjbmvO3U5s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180705040834_1530763883789_0.6757506616450522"},"_hasShrinkwrap":false},"0.5.1-20180705213459":{"name":"@atomist/sample-sdm","version":"0.5.1-20180705213459","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180705162739","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.5-20180629042648","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm":"^0.3.1-code-transform-registerable.20180705002613","@atomist/sdm-core":"^0.3.2-20180704132626","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"cc6cdeb930bfcde8c64cf9a890da20164a1ba30c","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180705213459","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rYyFgz7y10e/12zxM7oP3QLCYURdqtTFf5kfsMfc7QpSed4UtU8XMJsUkdnIqAbJ3DadNx0jK74r9WbtIqU6Ig==","shasum":"fed2df21dd5258c55158f44b943474e31f3841f5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180705213459.tgz","fileCount":209,"unpackedSize":629962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPo+jCRA9TVsSAnZWagAAQpEP/1bBEmYDvMVCNyMUE+yy\n2+6h6E7jfrfxmIMuRw7Xj/y7isR/IeasXFWGC7LVf5tJ5/wXF+RLyhWz+sDk\nJPAQ+fHEEj7yHVBlAB36A/64KLkcGTU7WxCMsHF9WVxanklj5XOL7n1kSyPM\nKjzbALH+X1fsG7OiRDkSFI2YGy8/5Uez1NK/lLTqViUF4XrbaEVcm3bOeGt7\nAOWb2qCoRLCKPt31IURLkaf+jIAlhckzwzoDU/8fLc/pwOE6TXha+jKrKO/J\nU9K3c0lW8iFLAhCXANcAtyokNt0rNLwi7DJnFc7qZeSEU9tMegTT4iEoZSqH\neDIUdPRxdELi+I8Rv0qhVs7fNBUxJNknryZ7vmCe2R0t3+HqcZihNdM59wg8\nJZ/XIAgTlK2fSg3N/ZZQ6LunO3aIQm/liNvratFDIVd9OHJkH2GBzhP7d3pL\na8Zgik3tUUXKeXTEMzav9QFSu3Yup0BYq9D/pkoD3zaXuTjMm1u/D44P4ZXA\nJnLzkQ995AccQh2I5kQE1af/b6kB5oMzh4YmGHyEZ6m6WCdFF0ashz/J+s4O\nmXSPSjxEpOs1L1rnpn+QdGbHfeXvDVVCxQbDQZJPq+s2O10KVqrJKAzea+g1\npjgBBcns2xViNuMDv916yMrC5A6n6PPjQ5uWZanboiqL2alislGk+NQH2OmR\n+qYy\r\n=uRbl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHRMMvdEwEL5e+0NeYS6oEpeXK2/oEEIK15qJiS/07JTAiAl5la/Pvw7Re+54hNVtJATO8FmAsu4xKhLDOkZuvfsWw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180705213459_1530826659181_0.3976632935974891"},"_hasShrinkwrap":false},"0.5.1-new-build.20180706014225":{"name":"@atomist/sample-sdm","version":"0.5.1-new-build.20180706014225","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/220060902","@atomist/sdm-core":"https://r.atomist.com/1036130643","@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2556011289","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"5350cd2c3ec246b5e0422a8fe5851b70d9d2cb4c","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-new-build.20180706014225","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-VAp9PHOAKkxaRRWAjRmlpab0iBgdqZr3RIoASRR+QDaM2vgTD45vtkiwAJytWBFig1i2CrQ96GEPZonOAOZsiQ==","shasum":"b225efa7f792fd8d5b5389609199e2e55aca31ed","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-new-build.20180706014225.tgz","fileCount":206,"unpackedSize":662664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPsmeCRA9TVsSAnZWagAA47kP/05DYMkJX81U9AFzfnoI\nydP99tQQpdTl1ANynLq5QgTl0hgHoInBweGr4oJEKTvwlRLnbFBDw2OxDuhf\nSypoPgScFhqr1n1TI4g0iEUEew0HCw4Or4JPGSpK8CIv27h/lm1tPyLlOkBZ\nF4e3N+O3ikAozA9kYwTQdhz52tZKwRKx7MuoknBTivajoDSQPmeiLIqfVhM/\n/xrsXDIyaO1G5Xo1oEcvpOVs+HOUTHW1uOjcAE5kHGlzXmWsQomTMnYfGJP3\nR0YHX3ScPazzyg6yaQUUsG6StVxL/2K0tTK3IwVYXZPxP323v3NOW91keSlP\nXJcJLAe478zbHN63gjOBoYLy+M6Wvcxr6JblqPQpuUP8zbctJyG5gDihMRBX\ncsFrt7sg5V3/4lyN5ILDqE+pcpNjuqjyD7qFxKAyECXfmLgPCIHhONJBS/cZ\ndC3AygMdX/Cph6QkfOBZ5KH13CSYX2jIsr89FmmCSDRJPVUokWVUfVWDqjFG\nYoLdw5WMC92dq3qJ1Mg98z0OW8gmlTjeit7JSQp6sufFzaJ/MRUjQQDw6GSE\nYWdMKXiXzL+UNJzty8PkP8emRDdY+baYO7FIoF409rxxhebP29VotYABZ1hC\nIq+/sQruVA7zyIYj7iDbzVwVFHcI8mqogShj79c/xOuplCfY0P4MYKTHHw9Q\neVvD\r\n=kGZa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwabH6pvoCHc4oy2r8x6o/cRHPVobg2/wyyTbTj4BnEQIgd5+n8TPB3GaWiquj1wzPwScV4DE68nq4CrJ9VEN2XO0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-new-build.20180706014225_1530841502875_0.9358448170761513"},"_hasShrinkwrap":false},"0.5.1-20180708035112":{"name":"@atomist/sample-sdm","version":"0.5.1-20180708035112","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/sdm":"https://r.atomist.com/220060902","@atomist/sdm-core":"https://r.atomist.com/1036130643","@atomist/automation-client":"0.18.0-20180707234509","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2556011289","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6f3a9b9b6110344ed87350eb39f0ae4113b469a6","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180708035112","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-jZ053hsu0HWEZxK+g2T2PjcA6yKUIfiW9U1LZvISEtodQKRJyBuVzdRihglPyPOv6zaG3YsHcY39n2B0Y0qbUQ==","shasum":"bdbaacf1c8c34eb8a78ff5fba707413c28e16150","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180708035112.tgz","fileCount":206,"unpackedSize":662789,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQYtDCRA9TVsSAnZWagAAqrsP/i0w+vzHriN+BrPaXCS5\ndW+IYed/4xYGdn+65Ac1BpbmePnlI3y0o+QRh41L4p6QY32wBg3fA/Wvw3c5\nI2Lrwtoen/8oHelw8grojchdJSK843t1VuV+JoUtYvty6gNt2llTMf/mTkpQ\nU6LGcWDs0Ggzgb3rXBPMVcgHli84Gkt75p3Cd+yIti6zsvkxtzD/69LNAqV8\n/def5AKH6GV6m4w61+CFjK82DpM3aqk+142VrYX29o9d3/76tute0WQkFhSx\nG63IwYugFJ+gnz7xdK5kiN8nqzflpu/HQkt4AbCbYz7YcO5HYVn/Wj7DhsIt\nR78/vf8zJyaWN6hlXW7AuSJ+X7gJKa5oBMg/8th3eE/VSWiIHQmYlPqccEEB\nQQIHdhNqalCWzDGgEXwnlVICY1S87kC4mShWGg9b/vxPgrIfpF2ArN7GFZaB\nU1e3B2eJE1Nf3wKGCM5b9N45OY6RMpCi2Ff0uVAnuOMWgp/c81YrK7W6uMqP\nTQ4QccqUV8kwnfttEEx1gMyKTrxAZ1sPQdc9MV0VtVpHLMtooI8fazpBICTg\nc4yK1S4pZXbw4fmJh/BdppszwHuwJgBrXcuo9f0VLlxYud/yhkCTMwe8F6Yz\nq5A2MlKBZkZjRk4481ZvTn9EpkFDmQsvSu5L8XOLWCJCr6B3H3VrBv1fNmN1\nCOIQ\r\n=I25m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSZIHQhsIiZCoKncf+faDc7K7QOcIAyHDgFyY58UxYJgIhAKRmV9NO9NN34MnwRxw/1qv0ZIQK4axl0HJvul3fjDFA"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180708035112_1531022147633_0.08320043809936184"},"_hasShrinkwrap":false},"0.5.1-latest-sdm.20180709000207":{"name":"@atomist/sample-sdm","version":"0.5.1-latest-sdm.20180709000207","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.2-nortissej.remove-status-field.20180706202026","@atomist/sdm-core":"^0.3.2-latest-sdm.20180706221548","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"0.1.4-20180629035326","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2556011289","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"03ea9f69d08304ef5bf409eb8ae3a231be8963e8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-latest-sdm.20180709000207","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rHgtNV0W7A2L0BfW5ayR03/Ke4llrB6iCq8J9pIljcvexZsLtmH6v773/bUsb2xjNwBCfMEQUrEPKTcjKFdZeA==","shasum":"2bfe44be2edacf8b89c95c9879b352a41b15669a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-latest-sdm.20180709000207.tgz","fileCount":206,"unpackedSize":662798,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQqcRCRA9TVsSAnZWagAA7N8P/0UnhzJDVj0DoD3qtjTr\nnlR4FiPMsCQTYVcjtnVG19tb+rFOGrA11F49eHgVJv/L8hrmW4x9rqxvMi7Q\n3oiThaxeIexlRMlWXp4uE0N6NJpu2L+2ODINA4QE/txYwRddAIPxeawxCtht\nUYLz8IOyHuitHmxM7v9U7D5/IChL6bWYjP81iKT13HG62h/dY/t/+N1tI6es\n45HpzVhaIQdvPZCOOXpS0rmkIoPJJh6urCYCTzdWyqVrPr0CPVoF2xUcAn3T\n5Y/hjYALKNqyx0t1ps3k0TcRfz5+3W49B0M2FNGsXdCGDRr+r3TfaXYYDXVn\nIpR9P9YxcliyWHUEGDG8CYTJVi4Z4YsbLursbltft9x86ow3r3Gc674hWwLy\nFFALrCg7xSjeOdWv3joF8pVEO0fhmeJAyXVeo7f7LhF7jNye6P33c/+GY5hp\nNNJJknGTGU18ICaI7maw0ARvJp0U6GkYV/wREu+onIDqQOUneMi+nVNArKRn\nGvj5bDkCpeujs5DN/mdwJuzAzzEV1+oIowNFkz1l6s4FXj4PMuzYuEpsclP9\nN5YyFz86yqbfPfcY0JjydMlgbXWPF/Hn261XejLns/2w25pxE2h/UTC4aXfq\ncGYVBORs7z5sLQWiqFzMrVDXub33xw3WqTvKCp8ORCnFnNmPKR1Wo3I2Run7\n3fEG\r\n=I7m8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEA7Ny2bh/uBE55nJVvS2AV48eTCbkkW5UUiKY77WtdvAiEA4eIzNLTPb4/9xjAtF3uVYN26LCgmcb7DLGztECw39bs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-latest-sdm.20180709000207_1531094801373_0.4403128997201138"},"_hasShrinkwrap":false},"0.5.1-20180709151622":{"name":"@atomist/sample-sdm","version":"0.5.1-20180709151622","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.2-inspect.20180709150530","@atomist/sdm-core":"https://r.atomist.com/3149443430","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"^0.1.5-20180703031914","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.7-dry.20180709011116","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7ed1b159ca133166c41ea8b0f103e7670baecc83","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180709151622","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-PZq9HG96tCfeHbBuqww2s8zMB8eKSXd9et5QoXGWhqwiJPLNWxZNHg9IMPcBux9MYSNqhHJRSGY435U+bAMCFg==","shasum":"1d44fee1cec4986b197a97ec5f42033143e317ea","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180709151622.tgz","fileCount":206,"unpackedSize":663184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQ31vCRA9TVsSAnZWagAAoyoP/AkXsbvNWYe2RS0Lf+k9\n6T9bYnGPk+1kxLV//PZeekD4nwAd8czHBs+ECd6Qq6B4mbBRbhNWQ14xx2c0\nnpNb/Xs+3Ol9VcSjNlh8e7ErFYX89t3GfuDGTteQaRuu+G1zvh+DDxm/y+si\no4/4MmxQ+DX4lreikTfXeFeHBbxd+10VjmooUSxxA2x6pw8i2T+QkDewnnpC\nRCnVWcy+7qRfMuppIV0mUqpQ8BLnbV8zphn0i0wJAd3JUF3h+RrOuNuRYN8N\n12A8Wpk7ohCJLxcMdYBurcYtvfvYxEuZYBwsaFKrux6bmjaqICrDXj8yZ7HT\nhDJrEem/9v58yRb1i41iCXKTcAxrpw0TLiMQzD0xHRsTXmaDdc3zNiBeYZB1\n3mMgv5QVX115DNeZIadHNnO9817KXfgT3AUI3LSQoLMeQh1Hq6RuztkNBbZb\nvwB/N1wtTuUE6Vam9n+1CwAdr9txd4fhB/V7JRpTWzH4UMrFMUUQ81Oivrrb\nxhhz+iSVBT25ErJysXb4JW8tFvbV1zSGsymAOkhiZpoYhTlJJSwtCYI0tIGC\n3k9n5Ht9OH0cSIFxLfxYCDXsuHrTDKwXeygOkyWYgOamAQTMj5SYrUiE/ttn\nlbGQXjS3POo0sPx8QCgQWu36qtixW5rXnGxmaoWDYK5bMXnx4Pi6wncmIssw\n50es\r\n=2B11\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDDMbIotyAp8xmh00ygi1uCuofPh3mxGDkj6Ojx8csEGAiEAiOets7C2Kw+6ub2z5hqvKccoS/zVsAdl2hKE3iQE1/g="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180709151622_1531149679372_0.7217800773150365"},"_hasShrinkwrap":false},"0.5.1-20180710005007":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710005007","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2679848212","@atomist/sdm-core":"https://r.atomist.com/3149443430","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"^0.1.5-20180703031914","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1e1ac74befaf36a2109af7ea0bef9da54f25c5bf","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710005007","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-5ZWJ37WqqSog5mB49Em3EPMJNP6Aqxijt6Eabk+HpgToMKaZI97K71ljB2WwYk/6OVW6FCj2Ps5E/HGGehIf5A==","shasum":"8f6ed67d40a8b3af7c67a0e91d3b4257b6a8f3d5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710005007.tgz","fileCount":206,"unpackedSize":663395,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRASvCRA9TVsSAnZWagAABn8QAIrCr2+qaLCFzheiqqFX\nlLJySC98lhL4Faq/0XvfxMlqOAfP8UwkumHf2XWRl7MRIQSU3uNtuTwB7713\nQOOpMy5DGyyvNF9QczSjnrXthXTdhUUJX5MBCwSg4GXVS5Gb4F6bMQnJoMBP\nJPAPUDwWNDaSSb7ofsuapEjuA5ZzsR47vAJlUq++1DKA+fS38CD3kWN3Zh5w\n1y+yO1YdDrq6Mf7LRjs6GLx0VIDNexSHeROpLscx0GptlWMhr4EGqnyufpSB\nzMEIXrtTVmEht5QUlL/pzHslbeGiNfU7eR9SV0aOrzGPSWCDMRRIs/TODcDj\nEzKwczToPvc4POxg2a3K1/Qmv/Y8wOZNOjYa06vFtP5cOWCnnYMB731qCtFN\nP91DtUTKn6UzwzvtgkP+BVcHDMveLzmZtncfUjxP0ahhqojr7Z0blmDi8G9j\npMOAu8pxFe+9022d1SkpGZY6vlq8NE2EMTfLgnUwlMqzKAj+UCCf3q6hwz3E\nyYJWZhbIBCB/jNpdfckiTaYdRD4sC9zMjgmGjDGtGVeCAhh0PYtRX5I1lYSp\nXajdT01IOZT4YEMY3O3vlGZMFh9cR1bKmEjn7mCOGzAmvjZ4MdK2YXNJ9Djx\n1K+D0oIeLNkpOsQbsO+ukOSZHa7dXPkYFbTW+2KYaf/t2vq1hOJFdTKCrAI0\nx4vV\r\n=1M9v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAdHoWnj0wbWaoDv+4p4beD0+ZVbfvtcTwPe/tcDbBq+AiEA8PRSZCRL17QdVBi9nmP0dzc9oOKLHV0/8DcZx880/V8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710005007_1531184303076_0.9254342567753711"},"_hasShrinkwrap":false},"0.5.1-nortissej.createTransform.20180710013505":{"name":"@atomist/sample-sdm","version":"0.5.1-nortissej.createTransform.20180710013505","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2679848212","@atomist/sdm-core":"https://r.atomist.com/3149443430","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"^0.1.5-20180703031914","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f500ebb09d32f3db935c845295b302215cd22693","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-nortissej.createTransform.20180710013505","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-D/1kCCEX3+8UKHPN7roT8LbCPzk/9nKNjm2nylX6AOtn7VX+iEUsCpJ4EK/kaInSkHFOpEAdT9jiiPvPdUxL4g==","shasum":"612263ca763152da3f3f7e003a2553b4178c22a3","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-nortissej.createTransform.20180710013505.tgz","fileCount":206,"unpackedSize":663177,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRA7LCRA9TVsSAnZWagAAaOsQAIfQXCfTs49RTmULk/JV\ne/A0LNBew3BEpAwKfG81Unf/NnrfHa1YYw1C0dwBm6IkOtABIy/E9AMswRau\n3nGMsiq+27+GT+GhEfaEkopbZzvJaQEiRG3tlya3sQATfOMLhZ802VE1sm5O\nAzjFB9lqk4g48K2cR+xqlZgF0SAfhrNERV6HSPo1CRjDLN+j6TJj5eE/f/ba\njOwDsKSl4cw/FQNkmm+RzNXXT4AMuVYIK7ZRq+5HJ27Ry3h7u2u4L202WBTF\nvTDdqemxEDQxfImhIYyIvr/x9W/7C5VsYM8VG7edSyHiHykjwjagaQgwuvzj\nuzzEfXhRFNvDvsexkLYMH3JCvRKqTpcHFUUQXnkJZozf+F8HJlDCp7yWaDRr\n8t0lPMLBdtbUCMmAj7xwt91Nd1K6fAttntJPM6kKCMIPT53HXemHBh/BUHWG\nHsVUxa6r6LaXcdlSCfFykx5nKO7rMyohiGKyPwNA1DQegPL2oUNwzH0iD9nw\nbH6oQDWpoZRaICvKTwqDv9wQuVttPO6oFEIKfUPvwrvrJy2u+8qdrGROXUIL\nyyEz/gGex5jZONqiOo67jkzpdHrgcTPTv9RMRT/J2dnoWcGgCZ8QS+PJCukD\nqwJ1nwM4iVFairXIB48W/djA89GT45k6jDLcPBYPNsd6QnHe5aXBC6+kLObA\nms2y\r\n=YAPc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQNzqhq+d1IMFvjZRUnsfctfWqrDTMQtk5RwhIN1NucAIhALQNVpdeHcrmf1WcO06uTqFKKrTg8MUpqXXDp3M/5sAX"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-nortissej.createTransform.20180710013505_1531186891008_0.0392405956611539"},"_hasShrinkwrap":false},"0.5.1-20180710013823":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710013823","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2679848212","@atomist/sdm-core":"https://r.atomist.com/3149443430","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"^0.1.5-20180703031914","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"2befb8a76594317b045b623625e760691138511f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710013823","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-m9VLUqvf3308I3nHmkLzCc+pbqE9eCKjbs4rVD0kYGmW2N9lELVOTk9CN4g7DJGsraWk+xTyWm1cUV6V3+yRLA==","shasum":"665284271ed96183b4208c7c99ad22cd177b56fe","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710013823.tgz","fileCount":206,"unpackedSize":663327,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRA+HCRA9TVsSAnZWagAAnA8P/261EEBG0AbWnWLlc0yM\nxWiDR1LH/y8fVdtQTgaF8kRrHa23YHHHUaXw2xJrlD05OqtBWFas/I7GYTy6\nSqAAZnDkJrag6otvyNGRE+JI+A45hc0A0FytN33L7SosmiFUYG/8NStsvG4g\n74JWp7MnQoz7bnV0k6Y55HQDjNjMMuufz3aGaShwRzG8MeCz9q7co/wp0SBQ\nudmLPDF8DCepy2Aj6WZd8Sc8dUxqHjKZLk5lXITKu5Xjg6o+0QSSJ/8z8v8+\ng7KRXQF8kSXjZDm23r/Yjc0pkcBUJwsy+YtH1YD8IoaPWsd4Rb96o+qkoabT\nq42FGoSDmjZpFXQBKQfWmHOwKduQgZFmBeQ0IuAgsUOYklq3ahsGqKBE5Hyl\nUfl82eOtMaPBd6Uc+6H8NYoSuW/i8hV9XH5ChfbUuScqUnM4qM9zhzSmP1i4\nJG1dISPrnOu9kVRiyN/RJjwzcJ4frsd58RD5THuL6/uxHmb/2lNotTIAjg5D\nDdC66uBETETUoWQy9p5zwCxHmkHKDh0GJPFqEWD34PQhwTfddUD0XkTfssCh\nCYTwcb6rWuOrwsvtzV/GL2OlkmPeNalTH4F4B+SEkmeEh/9+MUaW1MdYsrnX\nLxKHNm+jV0duLf/hbyeiIOTVaL3WmBS2U0w4Rgrbqz6WCRLkNWTl8B6IzBOU\nRL8a\r\n=O1G5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzF8Jak/0AYbjMJ0PMK49PV+jBFs1sdEAeHQ8kRGCU/gIge3WFSI4nQDuEY+WgPVOybcoo+w7SNQoxlzGW5N7Qz/o="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710013823_1531187079693_0.14517630073108068"},"_hasShrinkwrap":false},"0.5.1-20180710014956":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710014956","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/64857402","@atomist/sdm-core":"https://r.atomist.com/3149443430","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"^0.1.5-20180703031914","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1583413d5ce9aaf534f451af0941a921b0e7de27","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710014956","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-9yZHjNM7jR1qUEjqzbCdqy2htkJ5I0439lJ5+XNqMYy+A10dqUQll1XXjxryG7NhRVPbTQ54yEldqu66Bsoocg==","shasum":"ff9f4b6922d31a70b0ea9ef7d8a2c9aa77ecb673","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710014956.tgz","fileCount":206,"unpackedSize":663506,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRBHdCRA9TVsSAnZWagAAiuQQAIKiagZbJ9sXfAjtRXbC\nLGnqs/4M6fIqfLTDNmo5awsXsob3OmjjHNilajqYa9/26bRPSE05lYUadW1A\nUC8G1OkPTuITxOzDRoyof+I8584ArOHpzr8sBE4qC4JzD+Gmv0kEY4M0EGva\nDk2bNswU1ESd3ZokyZ4bncwkp6c7oztx5ZrtyVPC36A7iUKqDCFBHUH6fErf\nOshm3uGMsPZIlqzd/YQVGDjECorob8tHnP7T4RS61NRNQAzuN5Nt1JY1pnQ9\niNqIKOCyiOMtFAQT53uJ60Ce9p0ZycLr3o6GnWvcDw7gSK/QuC0x/ZATQw2e\nne8WWCPATJP20ooNqsjUXvb+ciirx23jFcAAWfkZ6GPEGPjjs9pPHmRUgRxY\nyZyZuzYHLRoytqqNpQVx3SNTvQzusB6YkYIAwQsosMlugT4DVD1TC+SUR0fZ\nqinI6p1IvZZi/DCS8gxFQdYeDbnrS6Qci1gvEIGNnLYAJpkmLjXOQ5Ld8zYp\nWEh9V9tVdgXIhrjb2rNXGYSlZTz4MPIfUPH9pa5+WAPJzgQvi1epsmUXC6IR\nrmasrCWQSDJYZg448dBi+nidi8qQU7F9sbRxmLsIulC/+UCGcauxQDzHzjST\ntxQwuLHT16djHIcJtsb0k8EvR/fnumxVUPTD7SN6KJcKfLaZJ+m/UI05Zag5\nyl7N\r\n=gDrC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUS1sPQ7g0uXGNiI6ugTlWlo4Eeaiig3M8Q4mmXZM4PAIgDuVwpAquqpjtCCTAZco9rYcl94xD534SSC7wDaLZdCI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710014956_1531187677370_0.8607229528946736"},"_hasShrinkwrap":false},"0.5.1-20180710050817":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710050817","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/1517823952","@atomist/sdm-core":"https://r.atomist.com/2829630464","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"07769709faaa7e86141c5d84f686033f84f00f0f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710050817","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-cn61JursJLv+ZoZ4B5sm3+NroiOIoNhHVYdAARzhm7AcX5Mt3uMIzFq2FUfTIH7nEhhdfOey9UrA8vw/iXr7mQ==","shasum":"d85f4cfbdc1e26126a89baafcd8687c8bac1ef5c","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710050817.tgz","fileCount":206,"unpackedSize":663691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRECJCRA9TVsSAnZWagAApmIQAI59H0zgMamcpOZ8WyHf\n0A4q5k6xBdGvk8tOPS4LjQbyo4LFCRCbiboIR0k4fJdEmhCFCrZE4NWiTOUf\nE4A2IhvpuSlbrMenC9L88ajIKAFxEusN9sE+7JFlS8VQKoq/AhQII6BAqcnI\nURsv3JriiAnAcB3p/ELBUxWNZPQv4K6ST48odxaQwMkJQKeEt+73ztW2SS83\nXsNDb4sqvB2FeSJ881bF9n3weITqHmjK1QAL9vR7gCZ4LgltDLI6ZkG5lYFg\nXxXL+LdzgNgoiwgaOsfLKRy7WAfHXH6jasqmv1RMsM17qA6oRr8AZaK+/M+G\nXPL4SK8NC1KLxaKDR6GIxChaLHG4iHLRlJ9BuYxK3ad4vbxfO0NhjTm2xvMm\nNb2uWgKIM2eE/U4Sn7CaCxbHFEGfd7jQHEOwOuaPQIb0tCQpzTkkawjv+soA\n8vIP+/1R+gezvR3RvgTJKfYLIrrAq421Z+yv8+OHSZsE+QDZB3+VMCNb3Rhq\nCvcGnfpyM8TUkjUPxb0arxSzsvR+7cT/yUBZh2UdhQOqxGHtIOZS1Wsy1r5q\nks8yvt3qAJO67Zaw1EtGDfKQ9PzduvM9yIQjqKqzRzfh8wXJkVoaaasGEogY\noIuARF7guCqrmisgIvtNCCJPJj0HyF3tfagzioznXnt23g3yDtSnkvJ0ewqv\nbarY\r\n=1CUJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHjTslZ0IfgLYHrAY3QnshOgR+dtz1Gq6cgU+Q3xEC41AiEApUJyRu2ajNnLXUsj/uYpOi7fyBAb/hXw/BQLTUhx4x8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710050817_1531199624899_0.6550090960705748"},"_hasShrinkwrap":false},"0.5.1-20180710051017":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710051017","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2301826209","@atomist/sdm-core":"https://r.atomist.com/2829630464","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d63154a7bc07e91fba269a9f5d949b79aa21733d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710051017","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-3Zi765AZZHOXBDPaBaitWUjgBXT+a3f8xfIVD2RS3s0aFMaIlBAjztyQzjLQD2+oM2kVoGWGns/7KXAkqg2V2g==","shasum":"7f4e84ff9c3d298567faf08d1b53510a404c4fcf","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710051017.tgz","fileCount":206,"unpackedSize":663691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbREEFCRA9TVsSAnZWagAAjM8P/1Uj+/mxSi0lfWUPwozq\nTVDuiumEXmopOCGf5ItvCgDqkIOmJCmjE7S10xGy3tTgVVoEHfkKJjK9fmHa\nfMVpMoQ3tdkcchf1T/a6WyvD2fBsZI5+/n1eT8gU53yxta0pnNPV/GYkApTe\nBNHvpLkMX/fTJZppXefXK5/xOqmNHL0SqEEDlmklBr+ctyJwhw7ODv5sCRYB\nkA/FyLGNXvAMkDw6T1r/oja0Zg+Zv9bExkS4GwOVg4+ohfRkDEGu8cRJ7fTr\nRQJ8G7+HKA2VbgHqQvRt1shpUpHKIgwaIq8wV9VVT29qIFjB/3327JoQ4vSB\nxMixtG6qejVo+DgwmQhP8Kc2KOd2NVdLCIYNe9gXVtxUprA12XRuIcLVVljh\n1lD6NWflhqnZOOtjHKQSgacsDb+hFJNr6b2e0A5orqCT0jYfCCwyj7Ux3/AW\nZ2MAajnpVAXTtu3Dpem0LWB7ZXauIWAjhFVuWIos8Ue87rSGscW7z+k3hcxi\nJlYWB97nH6Ka6raQoEwy+v/UUGHEmBl8GQ+ivEk3NM5K+7qdnsDOHFFM9oW5\nvq6J40hiVZmrx9PdBHO6z7Foh1cvsnvyNLfhL22w8OPwHf4LHjA2ezTkoGCk\n4TqsO3EN7MllljpIFZQqurZMAQKdzo7xdhSBXYTpIKjXI/+EkSAPtRjL2TSu\nWctk\r\n=JUbR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBoe8+rACgKvzVYeBli/HjxZycvsClkBQCFgcJHFaVlDAiBX/xb5jbFLMd/nxEorlblSh3KFZODxy0AAVx+uo97TGg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710051017_1531199749369_0.020477537910278842"},"_hasShrinkwrap":false},"0.5.1-20180710070610":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710070610","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"https://r.atomist.com/2301826209","@atomist/sdm-core":"https://r.atomist.com/2829630464","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b90da3f661891c8ce88c017e4cbc77dabe6594dd","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710070610","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-+XbaAs24WibTbAQsMRgjJkCxanD3ZWwh5eb34T3fDMjZuk0QeHr9dz0wnUhwwve380IbOMWExHEhGc56T57P/Q==","shasum":"aab221b11a4b7fb53a9693dbcdac293d52883f00","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710070610.tgz","fileCount":206,"unpackedSize":663755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRFvNCRA9TVsSAnZWagAA+1IP/i/hM+y5NQNdEHSGMoYj\nBAxM2lSzMd+AbGi/299rBqbqZIe4+7BZrFwjWV4eBc3V8qddd/hUBpLa+0+h\n76xWmwkMmwOQAb1NYGfMi7dv6H3T10MrEqfGWwmwV9qR18lkwC7bjngw028V\no/WysJpuodJlKahw7bwxJ+OFTxOIghu+ouW/airLicD5UAmsr2FbfY62b8Wi\npY+L0intg/E9KGv6FqTywgi5/A2anBT9ntBP6sc6VG5UE3Df0KO8Eu2l/5em\nlisH/a4wSjR9j6jS6Eb1fxOtbYXs8mGnbwU5bHwjlNOUt4WF3PzuVLTbyKWo\nRpdLzij/lKPRKj8RIgeo7fYP1ofkVgskVfmJWGaXLyA57vFgVLsQ/O9CHQyC\nZg4SoqnBjGVKIF91mUWAQG8xU6wXlkPf0hMDiS4aDNDbj05/Co8NOvcik95M\nb+Xm+Z0i+xM7XwAobNYJAbRLrv3oGE69Ee3M4gNbY+6LcOqGvKNjcwTAnsLS\nnG+idXX4HEwMyrYBKsgnaEDF5OcIXWZrd7pM6aW80RAylhHiBCtZrAKtBdW0\nudKf3hdL42vLoD65D6yzgD146HS6kSF54Fos8nxgy/55FOWatTlHIhgXu/SG\nIXldGTrNFUarZKJVYPuz7sUJDsnuoYzzT6qhN6G+tV+j9bMX2ux3vW28CLcD\n1bK7\r\n=xR6W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFdZe3SGb/QevoK9mnfNFsfZ9AT1N6qgVYPjXdEUZRfFAiASF1DcckMA6pv7zeW/yu1rh0ulLAsnKC9k5gDhPOSMyQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710070610_1531206605356_0.18920822137263094"},"_hasShrinkwrap":false},"0.5.1-20180710124137":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710124137","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180710123356","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"c3d51612789c3329b2c11255ab95c9553fbd5660","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710124137","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-1eUIq0roO3fMUuh27zJzETfRU858jzs2x8lsMS6xeotrDS65c7RkuPP8ygS8F/h0XjK043YvSsfaSXoUcf9C6w==","shasum":"e36d0470b3f12336426b9306620d011f0b7d5d38","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710124137.tgz","fileCount":206,"unpackedSize":663731,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRKrICRA9TVsSAnZWagAAC/wQAKBDtKhRP2Co7AMZ++Cz\nD2OP7Z48XQ7lq+XF8WZJ3PVRdaUYtPSHAbyybLIGVB4voesHUhgh7vg9AqgV\nLp6i4n7wOT4fCrLAmGbqcMdvJdCFKJCpeqUQigeKkGT6ZLnuAo899wJX5okx\nrh6dSz0dwCZZENrRG+upLQtVo9aI/lypRdjTST1n5wmj9MkqU+INvN1tr91f\nOrLnxlc5XHxoYPL+XeZD/ZNR3iJEPWgkiSaPZ80YUDaxO85Nr+34NJZNFu4z\n/2IE+qlvaJPBnKjqwxO4Daiza7Jey4MMCnwNA3/y4Zrf8AzdHwHmokQO+LvL\nM+doNmr+wPDn8hLu3wXrMBiuhoYDAombtyGr2/eSuBdQ82qJ1CovozPdRAft\newIJxysqqTWgC5Km0BUJezOLTolYqHP5vCO1a2qD3RkBjpUG5A0a8XOZw2Vz\no5QskPG1EAOlWpIbAq4yGWkbQMOT8ZqSeQVshOLZeNiebc6+15wGVwqtTY4t\n5636dDmxoLn/wvFmeiURgFAkJjn/uqJs3dqJ2cjviMS9CaqbIiXbwwsAIakX\nIuAN1beX7tVKQZs5SgM1pNpPAGKHH8TBvJnGeYL3Gga3fVGprBvHbqqi28mF\nGV/jHZ+fDjArOjVTYkceq7PMmzFbMtj5enxI5L8VdukUDrspMZa0g295i4ny\nOj5c\r\n=3Gie\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDEj1dZYrqzY3iI64k7O6Ef7bOBIgPYD4dCX0kFucc/jAiAPMhZ4lKmfO/93Gdq3NqJbLUH0uQw6QFQdEx2Sl8Wncg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710124137_1531226824899_0.24747411841712297"},"_hasShrinkwrap":false},"0.5.1-20180710130643":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710130643","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180710130029","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"fa0be60ccb960a0a0cd59b6903b6c180595ca0b9","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710130643","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-4uYeThuGnKNiD97FlpiO1/cr8UhyYwQvvUnIpPZL4S1SPMD8yqzmFftDDf9igZGTv0fepEzdGxxhEN0WvC0z+A==","shasum":"595361fcaca4eb5e3196e43ecf9d2bda1e048171","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710130643.tgz","fileCount":206,"unpackedSize":663731,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRLCCCRA9TVsSAnZWagAAT8QQAJvGE50OP/FR2fXnmHgz\ntwxBJSz5bcsy05GcrSmaGcBSna7Ulw5YFy95KRU2RQZOT330r1F7ft/Rgb4i\nJ2frZf7iJbqrj/o1lKc6CwQBsliZ4KYLMq4L2KvWMJQ8YMnWSr3IDe+qCNwJ\noEGruXA3wzqdFsATpdRMgvPqJWjBMSy6PvlHC2/YoU1zeItnLaPJ7qxy8Aul\nWW9yFGkywoujaxawBl97JyQv7F3oTqFQORzEpZWIHSE9R7w/kT0xjGv1vmTF\n3c4DFCZ6cC67FiXUDK6kTdSyTYpJJWHgEjYITbxfCiS+GuUa0cSJI3PFkmVf\nP75zxevkzCYXSnX4nZWCxf41t9Whm061itEGDmw8zLiwWmXXGby2fbET89i3\n1kh+NIwIxqg0PsMzmMGczNKZaqgIv1332PpmnHGiBJvRFuszyHHi/EjF8gvY\n+nlMm1W+HDokixudlx+tRsjBc1s8ZcN0bAmYGDQRTDFXyYr0YxjcV/i+xn3b\n4beBF02HIK8R85vaKCsS6L+pa3EHed8+xCI+vAmvtGAnjc+6GoFDNzeq6goG\naK7GE6GA83BRv073kI/Ydb7+wdwoHS7J/3+k5H+cAsyucdY9AgLyj6Yrfre8\ntSu7wJ2A8iU+7POTGTA9weHVrTBy7jmEoHc18+5JKmDJep6PEt+F1cUa61R8\nb38W\r\n=h1Ll\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2gbuAPi+EdRFhhcMTfydKQOuyynsm4p9wdd1aTfL9kgIgSmGNBzBrePICxW0zbvCAjGIeDJgdrEFhGaI3Gy810Mg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710130643_1531228290393_0.3891059962020744"},"_hasShrinkwrap":false},"0.5.1-20180710201346":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710201346","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.17.4-20180628204109","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180710130029","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d8bb630804d732dbf1bf17b5c8ed9b1c261a8b6d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710201346","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-MP8L6amh4UotStASaxXhciJWmpTQlhZV8UhYe91qvfKKqE0XJI0Vbm9dBazFRFEvSLznMCLE8Rd+1vPMMfFwhQ==","shasum":"1fb53516a029d7efc1d708c71a461c81b66ef3c6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710201346.tgz","fileCount":203,"unpackedSize":648484,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRRSwCRA9TVsSAnZWagAA1igP/39q01x2G4adLzMDz1Uf\nAnwBBny3qSa2a7eNByx6P1i8zph0UP6wito+vY1ZVL9QHrg8+m8a96lyZEHI\ngdJx3FvsNcIF5E7cwc1XTYdmJzRzMAakVOX4Z80atiXu3yJ25IZATwEkYijQ\nsatLL/bpDIoP+LyaHJFE4gWzy9Lp0Iq4a4wi4JIJ+Ky1+BMUR+LwZCZ/YAHm\nXuNqbJKRT8XfoVFuBl+RKUaIo8ZACCv8nnMvTTX3vKq14llfo3Iw1ZYHaNWh\ndhAD7B8ehqR4dXTOVj4GiqyX+rilW2Yci+IWatM6tUIIvrR60kR1IQwjEehN\ncqqiwpnwdaY3jyDvCLPrHXZlcRtMIDuOj3B8IWfqR/wLtTtnkuKM0mmK1XLp\n30rgkk6vvitCpLDyEyjpWqKxlYBZgf1wWRyS0lxCnEV/wJzDCkRu97iEylfu\ns2BkcarxI04sMT369ktWjbTdaVmnaCN0VKM5qdLmqw6NaBWYBMHARdCZFgdW\nzMsrX6t0l6D5JdJXuRcFam8QstS4qruDHwGHt05y3uPQzoEj+cD6oEvo3cnC\nn8Tnfole1ULiJBZJWfia5NmuNMUZrshituPFb3i7B4sEegTqCq4Arp4rAQwB\nPUKDnlWFQ2ft8qaLcrVzO7oXmg3Oz3mZNofWvyfIPoNlEjyIqE9NewoqMzmv\nIht0\r\n=lNnk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuOLaGImKrkxjalB64E1KC6VKskS8LYyhxdxphuodONQIhAPUYEE503fXs9krssUBIeQ2r+tO6ybQ786mQeWipyUNk"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710201346_1531253936700_0.47521290622827084"},"_hasShrinkwrap":false},"0.5.1-20180710212339":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710212339","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180620184836","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180710130029","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"06f171c20094d4b8e113bd1a92fdb98042494cc5","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710212339","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Pah5uoAYNhgzVWBWQ/+RaTXryCTW0Gw6ui0nuBeO7zh20bRU7Rpw6TyORB8jo/sv/kea+s1ehbXY6vMC+7UHEg==","shasum":"9520cfb673b394f5a04cbed0fc3a7beb70ebf803","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710212339.tgz","fileCount":203,"unpackedSize":648678,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRSUeCRA9TVsSAnZWagAAr4oP+wVIi4UOVnsCqaYzsRQ9\nEBqJ5Wh8MR9utxOI11uL/1dmgEeeE9ahTJoOXEFzCJnAwUBX4RXLeMiImjdP\nDi3YSrnAStWoDfZnHDo27Ovwqj84jgu19WD9jJS1kg4mZcQ7Q/kvOWgH9XlQ\n/kShgHdD6LcBivbS+ZSLxB5tE40kq1/AR3bIdaXGoAFJSmEk7VgzfZZKEmgB\n7tVZfVz9d/WIJ/9BNuLa1MKW9S4ZxAMCvG/zCSP7Nzz73yPJlMaRcGMA6muP\ngCKPmpidW2ZFA56cX2vbyLwgSOZJ+DGhwZCcrlQfXEAWH/Uqx1WRjGw28Sq9\nBpddbqlZmwGdPc6i1GnnQjZ35iuYOzv95CHIylG8lWCTYtyU37h2EMQsEt0x\n4dmpDwOJf9B4EYDUQAI6Wt+PlpAppK4V4uRZL/Z/jRY2duDUOMjr206zYvmh\no6J/eMd9zAxcLh8a4r1kxmdooxwPETkuSPTECVpzexV0CJto+EPA08o+xgnc\ndVB/EbCvwS3SNS7RmzvYWEd0JSIGpg+fCyCEfewU6MRl2R8Qez4TCnKPnBZw\nVjho7Utu94yc5ujcSlJIk2Isk3fDFZMnJHf67sHTv0Pd4pEhLSe23o55VyJU\nFYxDikZ90JyMAvIMXqQNtOVv7Ff7Su25lzqpQtaFCONqS5QgRQyfJfL7qa1r\ntVey\r\n=6XRT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEELWl0UObF1htMpS92Qqzz3BRij6lC+c+QHyAMB9KWOAiEAxx57JC/8V6JJcIjK7+iov1ApsIxiXTgiQDX0tc1Tssk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710212339_1531258142265_0.8889521882458118"},"_hasShrinkwrap":false},"0.5.1-20180710221517":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710221517","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180710130029","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"c2ceb2a0d4832d5719c4aaf343e376adc066d1a0","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710221517","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Om9+IxUtjwDOzxX8P42uaTgJvFQgvaEj8UXcKxQx3Emn59KWRASpgbD1H1KbOfHhrLwsxvDJAwsBNJYdTH4jsQ==","shasum":"bd367a6ca7e14bcbf95e5c354f2432d5629b1526","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710221517.tgz","fileCount":203,"unpackedSize":648678,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRTJpCRA9TVsSAnZWagAAFFoP/11ibNkNyVIj99mCJJDz\nxGeDyoWWj3pjVSA7oyODLr819AoERmltYyVKef2g1sb0IW03RVRc9n1Gf+1z\nJpbDidXRfC8torPB2lGSui6JzX2bG5uO1XcMWMZ3DdwlLthw8Ol8CwSqVnPC\nNe4wDGVT+3/3jrPbCPTF0cRwkEOjO/Bafic/PzjK+2tIdO/bj0m0AT942ewt\n4y4FrlfZGf4d/+Vncf3qd5hnZduiebOPrOrsTSOcfsnnnnN0OV8UpgMXLS00\nv1rknoiPzqaMTbXRX/aSr+wQZkRgWKLVJzWdP/MOMNfR44ao0LcDUwG304dN\nuRT4r5aMqUAAnAusR0KwGnj6nQxdb2NvIKXGzYt9xoppDUigNoISwfL1UUlT\n8aiK4tyvUBc9Vw6c8P9SXaorEjARxnvl4wxOtdR8k3MpFRVzmeX92qHHIXY2\n372K8DZCgZ6H5a44g3pA8B+8cDQG+WBCtVzPK8xi5SKT5Eqs29VVhnQf0q0O\nDpLDZlKn2Xlk5LM7Sqn0KxH0SmtFbKnrls9v2YAYO95eJl4K4JkNn1fgynns\n8xxjqx0pLl1pGiiyx+o8+XQzyZ8dPIvRFlgV9r6tue9QQaaKFRpnD9ByydLF\nq7mt2ZflzAcQuESsXnq9DvXES0souWgOYQ9aBrr6V6iHcJujY+kSTEto5NwW\nNQDo\r\n=EwWZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICK79kX4fBIX7IQThwrlJFTcChAI271hlyrLAMKtb8f+AiB6A0Xstv94fJ868iSwOc2JlUFqsHbWhq5SPY8kNbkMxg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710221517_1531261545811_0.48106053750213307"},"_hasShrinkwrap":false},"0.5.1-20180710233305":{"name":"@atomist/sample-sdm","version":"0.5.1-20180710233305","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180710130029","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"916eb5f59769b1861884d3d847aa678ecfe96517","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180710233305","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-LOCQKxTCvLX0v+YVVskLO39LKWVNnVh/hlkVGs0WBKOYseeTjWsNl8zRNT0bgL3BVI920CO2e3PiMoz0I8h01g==","shasum":"a1d36fcb6dadddb97e2df8ce3eed9497a02cf118","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180710233305.tgz","fileCount":203,"unpackedSize":651621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRUOcCRA9TVsSAnZWagAAr00QAIYTeOQ8+NsaiORe1VT/\n79/xm8gqzdQbCXwJHQ2Du16W2Y7VrPdJf00rTAshC0F/aURlw9RDWD3DhPXn\nBW2WR+yA+OGfYaDixlklclZIlKNetoAcaDt61TTArYOEeWRmxhHzVvsfKtEh\nPToiUcFZr7RcbZQITs2W80gWJYvYoYFnR5Ny+C1lutq0ZR2uFgrGg/26oi0B\nduPX0XG+RxKuZeQjlCtmVZiUaMRUmhZ1B9voXGNISgrBEVW6ojXphvjzI0v8\ndQNgOAO1gnJKUlZZZBgdgi1UXpZl2VzIXRg8AigF5Ptrzb4N3+IDLxY4oHtK\nq26Vo6M7sxp6jnCwzKx4ZgEF9zTNOqO7DfWmIcXohEjngNVZ6fvFPEdrzyAW\nxrGUMhv8h2xxdQ0Bm2GE5PaSACn77nxSDbHUtH1tdYu5iemhFyGkcfGDw6ie\nPFYbY+grj9vZgR790eKqvLH5G/eTb22E4RvZUxoidPHtcVC5S2ol8s/xgOZu\n7+GVbsRFRwck0rM/nRGXc55LMfCr2f2yC1z1Qavz/PqqVGnxMvpN6j6ywUy+\nNpZ2LB1oT1ouAOV9bsSD5NN+8600KgvWuYe1qjJuLtXfHWNTr0VJ8ggjrtge\nDoPCwB3vbVNRxRGUJXuRo6CFTk8IKj1H1Wx4Y2l+nK9GRNYb7WeDxVqO45rY\nO0DU\r\n=A5Zx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD/SRwGSsef93fuiTtslbFUsFW8Q0KH9q+f9UTEmtNwpQIgOMxHjAjt56LUAUsyc9dfGZkzv/SSir6QZGMpvP5KTbQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180710233305_1531265948731_0.8492736594264321"},"_hasShrinkwrap":false},"0.5.1-20180711104417":{"name":"@atomist/sample-sdm","version":"0.5.1-20180711104417","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180711102505","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"c24d02e97f506499a70412c86a37599b55c2068b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180711104417","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-vIbFPJ8gSuC+KE6OHOpM4SeEDxmlAzGVvt47zxlWZuQ4Mow26nM/inSpFF8KnVLNVpOkFiediVFuu8PKfT2ogw==","shasum":"6ca2f584150cc15bbaecb18b52e02fe0414e0a21","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180711104417.tgz","fileCount":203,"unpackedSize":652476,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbReChCRA9TVsSAnZWagAA8hcQAJ+v+NZvYF2bIADkOvBM\nRlwQs5RhA9BheiWbsOW2BTJPkOf72dFrHwNCyaAEQrwlEiZheegXG8Jfuyqy\nw02mlus/kPek5lD7yMMjiCn8PHpt6LOIhxdO/wTlmEFngzBxadLebiMZKRf+\nOSsGRXHsBJ4jK7TaaaiK0hHHpLvd9SuhvPUPFjJmnB+CiPAMzplzgcDsDl88\n4x0b8FvAuox2yqa6q4nLSTwiffI6ydujs//A3A2WrGHAtVeTQOW6/mUELZ30\nx6Br1OGl+50CgZy46c9+Xstk43Cd1f7/UZ/lKxQKlWneV3M6FAm/6jJSCUvT\nnMFygvm5MpE4nixsOgVgDs2UPbcGBEmPwmPR0zQep6cBgCaIAipzWrw2Lod0\njOvAh1ive+c3gK8F6fI2WwWQrQuW9UZUv9Qah0ejw1+THtBj5jyusgmeNPsQ\ncopAAWNQIfLWEB5wipxoeUkRtD+IHfCvUJzobu7smiSE5z3suluy4vPofJlw\no8cptEeI0aLDfOhITOZOuOpP90CZ1V3p+6n4V5DrrejVfhSKDIDhs79OnyAq\nzUbmj21XwwHV6/tAm3iOEuVmL5WhpPHGfEE/iLqghGWdiohysA3IgUesRoia\nK/yPtKVYNKlzBmUqHs81/KKM/62H/ZHEioWi0BOFAjTR3KIM4G9b1WAwo2IW\nM+bw\r\n=8XHg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfR0ppa9SM40ZYyCibbU4Sqmx8s7S5iUr93oF89Qt0xwIgRBFQszft0Ey75YuuU7VWQkDmtwuXJRe0wntYuvR1fC8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180711104417_1531306145242_0.2736680774085323"},"_hasShrinkwrap":false},"0.5.1-20180711152429":{"name":"@atomist/sample-sdm","version":"0.5.1-20180711152429","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180711102505","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"8742efedd6ed9cf66d17f1ae7d980eff581de844","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180711152429","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-BBo45pllEiSDFjHvmJBGUOJb1V2gIS7MUQLICk6s1/38Kx9fXCs4eY1FundG6U/tuor2f7//5qn446pAV8FK4Q==","shasum":"e5469a6348c84ec79884bf38756459c14c7fc669","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180711152429.tgz","fileCount":203,"unpackedSize":652528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRiLBCRA9TVsSAnZWagAA1xsP/13mx+jZ8SqsgdFYG9mI\nVMUedQmOFiXni2KSwGGcd4qGFRCUgUcaoCIeO3WX6iOEmzRQJr23Bp0B4784\n11iN1dcQbtyQq1GFh3phF90YTkl5BjPmMbzNUkOc1vF4sf4QnhdBHSyq97W9\nDKkWjhObJM5HlvzeYDjkVCegLnjOMsgbnHfY6FwIFgFgMX7GhIC6d4NiWtLs\nwZ7RolDEv30xJ0IKwUrtDIbr5UKe03ziBxDaTqOkGHbFgf4a+8c4u0Xd4uv6\nEwjYUL2XqY+vpfkk1wFklA4hLw8Y4/Iy7GTspDPU0dmSn+C1TFxUQJE+ZXV+\nkAkdHJi97adgPIzgiLCOgClRu3BXsXmiPUmBr5fQaZ3b/Gt6XK5NhctfHd5a\nFgbomTptOGZS7P67iE+evoa+I1adC2UpVymEezLz88E5ZPcO6TpIwtfcX2Ne\nOBn1sFUxKUEGpr9hvi2OkvViUvEyJVqJg07PzsPm1NqeYVA4w/0Z2FYmRNJK\nYiewQfo5TFoKioY1i7uo/jtgVLHovS6a0UDynURHCXS/9/s+hgLHWQk056ip\njEnTOR8ue+ncrTIAgL4Yzlmo1xiJ9qz3feuVHsNc9ePZKFiXnU4vnSIgVMCJ\noCwojM0J7G4sXzIkjTe6UgnehngBJEEnOgMMmYkoAf8dNk/iocGvnXXFjPN7\n3EkF\r\n=6v7i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB9bVjkFLowwfwz2I1RtEXGvUGEISRSv3+C+TsOjR0zbAiEA5mPvX+kQ3dd4aQea8EsP6E14/AmMG9igOX46oy4yk8U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180711152429_1531323073359_0.9079569647203694"},"_hasShrinkwrap":false},"0.5.1-20180712010908":{"name":"@atomist/sample-sdm","version":"0.5.1-20180712010908","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"0.3.2-20180710050414","@atomist/sdm-core":"0.3.2-20180711102505","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"8742efedd6ed9cf66d17f1ae7d980eff581de844","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180712010908","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lFr93m4VmxW8VtDdT2fbsQsbYbkKnE08GP/SgXIvN0GKp7d7KY4A4YgkxQBD/LlglnX4Cc1F5nNHaRdXthh+nw==","shasum":"eb56e8da5f046a0776b557b31d6bbf2d400073cd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180712010908.tgz","fileCount":203,"unpackedSize":652528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRqtMCRA9TVsSAnZWagAANIYP/iYQHOPtsDahtbGCfKYp\nN8Dj4pfF5I9uZXpAvw9nPINGJTDejwmxSsZwczOGBJdQ3JtBbXo97iW9YakW\nJ0xV13labq0mwWnDq5fakTIAgeAs3dHdAM0HUelMg4hJRRtvRtX2MENtU6tv\nEpn0/VDfBVbelEaRxo6rc972Y2Tz53eUpenMLlvr1QF61S6hHaic9GDdrPI8\nEsKGU1+dVDhTmyhL0h/2AukpwaRYFb3/yMldqMn3XENXv11/QcrjhVi5XJp5\nZaIf0vNkEXRst6ha4sSdo4Z8JbdcapRjtvTece8AZJUXj3M1qDZupfPN9nd+\niOpOQjMp6EjDSjej/EeOh7m/HlbQ28EJHBz14RyvACTVj/lx1QfxWZKKkKbR\nTLdkCZAh10cbzryX9PCxwPT8hxYyNX9gaVblgz286T9xoqr8siE0Gvg01qfx\nKSLsiihwaMhFDheFHDiQG5KcmuJD6f1/ybeTtX59v8dGqVW3LzyLO8KHxeuL\nUlY97iBM8FJJbw9GtIxFvj8dy0bzPODlSePPs1TCfB6Ae6sIDeWpOVWeMlTe\n3k9uBwG5pW5JYWSFMpHJiuQFgnPeb5IKj0QkgG3FHSPeqnLryHH8V/yedTyC\nDiemkt76P2ivynbzlrjVUO1c95XZG0YEAxdtcK6xpEs3kf/qKym7fH4UFx3H\nzq7/\r\n=bQyo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDLcowNYEhrBPBZHqftPhprF9+apPU8NYfB60aWJqQodAiBt+lA+mxyb2VmVZErK4Y6E/3qGzdB2iJ/m2UEqpvI5ZQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180712010908_1531358028416_0.6364678139135163"},"_hasShrinkwrap":false},"0.5.1-20180712011315":{"name":"@atomist/sample-sdm","version":"0.5.1-20180712011315","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"^0.3.2-lazy.20180712000747","@atomist/sdm-core":"0.3.2-20180711102505","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/3942602905","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"ad194a4cdd6c38a0d58a9352ecf05afc63e945c6","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180712011315","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7rFcKHxxexQqUH6+DhOhitdNz0wXUcdL6Ehb8bv9MGeJUEQ/neSce/ZG5UgTzFZGw6nj3zMLiFglW0mZBmY1Mw==","shasum":"f1e1effa0515b0f10245d56cd2d7112dbe7ff5a9","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180712011315.tgz","fileCount":203,"unpackedSize":653197,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRqxPCRA9TVsSAnZWagAABP4P/0M/2G5G59WZfI6J66cw\n95bDkjHm9s9iI4hrtltp6kqPLIbw/TomJSG1dyxs8pgcyL1zGeA5meucNNSZ\nIXTDTrox1nCxqS1HZLFW5j/xUSCS3hDZN2z3AoUIm3vOv//k3yJsTw8R8vKq\nNtBigCaP0YJT3pYixtqugY1h2H51+K2vp65WVetT918evcAPxC6Mr9zYfc1U\nMm6kc0R51b4HW3q9b9N11Z1fM1rUwbzmMCNrfSbL4gbcN56zfJZYptxw0AKs\n3QKLvAFK9I7m42Bi+TvFSrp0FdXEEKKQv4isKoOcF4SVHLNJmxPcpaKUmYZZ\nlOh46ZTKIqLHroI02UQDMo1Xw9EKpfjSuM1xB0QE9h7olZCVX/R0IAJzk36c\naJ54BSNSvWzgKnhAbFHQn/MUmGeEPnBlAJvG0v09tXafecVghMK17nQUcD02\nn5jHgOf3m+7BARXSzXnoDIwySl/BxtwUuNwqsjeEf4CnhqiubpJn9DIF+OA2\nqy/TRXgSgaWd0K0rTtgsFOKqtS4gbVwJkcUqCyrNNDgPP8JPOCPSX1Cnwvfb\nAaiM5ad3NY8QP4sspn49r8EaLU+3REVXnfNgx6FVuNEa0qrCpIv6r7Bl1jiA\n/R5176TSb52RrqVRLNKCua9+PhF/4dc4m0aqztAEhwF8J+pZ1DvWIvAGkOHo\nSEDA\r\n=I1rc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDh1CtD7d6gngJdRmpvnslsY3A+SDlvaNKX5oUVTiwGAQIgKX5tts7YIRifXtuvgr8vSwLNiZGYVrViZa7opQBdGck="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180712011315_1531358287621_0.16525940198215627"},"_hasShrinkwrap":false},"0.5.1-20180713054024":{"name":"@atomist/sample-sdm","version":"0.5.1-20180713054024","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"^0.3.2-rename-listener.20180713021926","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/368557779","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3e45224e10cf66cc28eef00cb0fee5310b32be07","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180713054024","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-58Pdg3EQgXB99bm0UW5yV8F30ljRt52PWMWhJWmxzU/8zbEI9YLyRON3gpugEqGiI5bt4K4EZCebh2UuPp/A3A==","shasum":"cf72d570a434fbce391eb6cf50678bf156d78083","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180713054024.tgz","fileCount":203,"unpackedSize":652747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbSDxZCRA9TVsSAnZWagAAIAgP/jRefxhnO49CoIhin1qg\nWXG9n0Yh12GTUdo50QRcE+R/XJK1GJyMfKlYUJ5FG9UNSnAdytnQ6FLDV4NW\ngNtfVc4670RBoZmB3ulJRcI+QfUBLcsiYM4/AZdqb+wIjBN60NrVRsuyjvY/\ngSXGX177GK8fBXrYiwkUbxwOnCi7iEu0L0LngIdQxiW7LMCVgJr8K2abg+nL\nDXkiDxGDWc+Nq9Ag7m8kONTVI2IPewSq51HfifyHTMexSapfw8bQ0ZdblK5H\n8cq2n29vidc7jBgWQDI9A34B0Okr/JocMbc69nPBhTWrH65ySgGNKPr8+uaV\nPs8t1oxBKGwUGjDdqwKAOfLF6L5ZubGZ0/Evpt4WARf/HZEw72JqPrgpUCJN\nMTzoK7w9Cj+1rThxDHQKuHu82CIjFeWHDEcPp0u0C6Vxkf9Kj7Atxo7gBZ4O\nt2P57TGaHfwaHbxcfJnuSeW/FGoOZI+6wL9oy6YPZrw2aJoH9KzcSvlT+j+1\nPW9/B1QRPMPrQJJqohEngtRI6ncHDvVa45NgCswyxZXnTQRrYD6O4qqo4159\n4i/KqmK3xcvg7Kvhlcd9MiHnUEqe54gEKmKza+JvptHYAAz9vy3uzr8cniyf\niZKWZ5k6HRWEn3evojiBtUMQ7P7dnsdfUQdn5MGH+YCUfnNn6ABNN9Z+CCv0\nLNW+\r\n=2LpJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChQXHBSRtkh2ABGLvSmgdlgchmsMhnSYXb2uahm6I1EgIhAIaBNytArmu2aHql9HJKo81omH5rjUINwBpV6Ytlzw+H"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180713054024_1531460697476_0.9865187352230347"},"_hasShrinkwrap":false},"0.5.1-20180713081701":{"name":"@atomist/sample-sdm","version":"0.5.1-20180713081701","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/1451694078","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/368557779","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6413a0cf444aa9745bc504cc15848ebb7c888dc8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180713081701","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-hycDCPi0gMeMuWGVuFJOnunbIgJUZSsZiOe20a/7QAxR+OvHJKwIrf0ezEUJS12NJ14fbLqEw8/cqyY/ZoBiaQ==","shasum":"9d1e72cfd5648f6758cbde52b14a58a168222775","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180713081701.tgz","fileCount":203,"unpackedSize":653272,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbSGGMCRA9TVsSAnZWagAAkK4P/0T0QxIUH+memf/bcKKm\n6qYbvoopXU9I/Zi6GYGINc4qWmgjCQFPOxsYYSduJdwDEdfndwH8Tkvs0s0n\nl2iifb/3GmbJZt9+tTbZNR3wTSNxHWX5G9G3nYox39vCiWbD4SUbp6K2yNZ7\nrs+q+dxZmBHymL1kYnHQyTM/wrFXdTN2z4K1ruV4aNTnpBuc0tWoT3FfGK9p\n/vG4t2AGmOg2J0G5QEqOawpV85VAbgVXgbERK5kz5oTEKHmHR85qcCA3/wTE\nGFZFGo4ga0uf8rH5X7GKGecOjJLrcjHCNibpfV5ci89TQEGRdhxkYTiGpK0+\nzYcQ6Zi974AxDVcystiXHs3H78AkOKYHS8XR1LwE5Ruh6wh6VWdEHV5H/yPN\nSbsDJQ3UTigF2b3Phwz6GaDEZDYnn6GSCWAbPLtoyvirPTgEuugRFk3hngjB\ntESwMkDBoTpjHR+s9GUC7Mm4wfZKY5SgQNnOG1MwgzIap5HVEkSTFqSixJA+\nrC0m07RxsTU9qGxP9KbWOGcDst6iNueZYoyec06LwDdwMIb8gcnZuYlUAGMf\nM334uE0SvwzM/usruAcksg7GwQ0L7UMZEHoIHx1o5WcEO3sj4vKqw2WL3zfM\nH8t3uxe64zGRFqBKwRc0QExVAz42jxHG/MTXIH3M6Y0szjbOi1nyLHWd0xiZ\nrrDF\r\n=rqqR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGINk3eYCBcrHNk9CAeXUTzZ1qvxv9z0KpfbMVbQVneAAiBwjpW/c6wJOOVlei5kj6Ww3hFisqFt/IfWMM4NQZNM+g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180713081701_1531470219772_0.29987863659953384"},"_hasShrinkwrap":false},"0.5.1-20180713082231":{"name":"@atomist/sample-sdm","version":"0.5.1-20180713082231","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/1491446391","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/368557779","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"64fbbf79aed2a4785f10c52ec39ff679350c5a1e","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180713082231","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-JeFndab0i7JXqQymGPopClRmfzqaORN+SHoX7Y7wAzhwvYxQOWdoOjbKzNh/kHVgJRmoA5rThWVncbv6X3+ByA==","shasum":"2a0059732bed6ec5bbbcf198c8cf1cdb6051d25d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180713082231.tgz","fileCount":203,"unpackedSize":653263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbSGJlCRA9TVsSAnZWagAAvaIQAIhAO9unr+dzZJHK+4tT\n3xEEVrJBcHNZwPUZjOz+GcQcAPreSnXupNBsigG7VczmmNm+wgiSYsgrT8FO\nLzdiOTG38e4Ny8jHbTMDZOS7cIbetnhd5CGBDL9KxG4JFcUkhCc1SJmq2Mpd\nmq19hY1DdnslFUqcntYWmEw2krKe4KzPD7Lzw9Q9nCkOSHb7CgRTyNrQfsX3\neghczi3p89iG4OslNTq95ebZZBKqGgdTrEo2PgxZRmmsyRgLrEpBu5fJwx0r\nupluP1yKvN1QcU/DYKQwGt2cir6OKK0tKYL9Ni0ky0y+rL8v+LHxqQM8tslH\nOsSY0XKGBYrVTwkI3UKu7OnoS8pPFekvqOvqRs6JMVmN4YoAf20irov/amT0\nH3OM53APhHoLDa5dgMUzjhZXhxsLcn3gcWez83owvI0MKKBu7rY7PPlGZdoC\nWMQ/sEjqMiNdKBVOtQdrs/C0TpZy9DZFlNsp5kZgk/m6wrNUvK/rOuBYEPZa\nrzsqRKZnKl3GYnFI9n3WEBntLBz2peK8ajqluC5CUVOgarjMhqhxk/cguBNi\nvHrZOPmwt29dtYUTqvzWd6FM4p/215dhpirEq6PN69Mus66Cll1opR647JW+\npqOB2htmIoxXcRgez7h2qm9mYHLqAVUY9WqGxr9OtClSO6c56pOGkD+smKX3\ngK0w\r\n=Pdos\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDG6WL5IoYMpno93QUzx8uKfDhGsv6ImPBOF+2J6+1MpwIhANIsNdGo/JtJVoljfTzw2I0RQv+9F5XriR4+fF8WmlsL"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180713082231_1531470437087_0.5411189825730327"},"_hasShrinkwrap":false},"0.5.1-lieven.reenable-local-deployment.20180713084032":{"name":"@atomist/sample-sdm","version":"0.5.1-lieven.reenable-local-deployment.20180713084032","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/1491446391","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/368557779","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"88eabda8f12415ebaac82a79041b7a7d714b15e1","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-lieven.reenable-local-deployment.20180713084032","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-oClvqZ1oFfMhGJFf+dhTmxKmqCmnKf+HR8Lnyn4/vI6bUyet/sr77f+s21fkb6ktEQwW8eO9j+racjDB2hWtbg==","shasum":"6af0fde6592442a961af2b1aaf452dbd0b223c9c","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-lieven.reenable-local-deployment.20180713084032.tgz","fileCount":203,"unpackedSize":653716,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbSGa7CRA9TVsSAnZWagAAH+0QAIhAwTKKuhKPFQeCl4D1\n/aswhRhV6DgesFR+klAt3929c8ndfGmyFTFjMWSean33FYuWKpj53SJuORtN\nPt4A4NkjHHp9YN/G4dSssKH+mlUOwX3WqByFRC2yFWt+bzcqkM2C9+nC5KWY\n+mTnXXsY8sgLPnc14qs1L5/s0RHscG6AeQcX4xBaMdoBXUv0/rAyBsvTr9VN\nBVE6DyLTgkRDIlamDBxV8J0tFkFEHHM3vxItO0Zd1KtepSZ2x4vM+EYRdcTd\nzqbqXaU5K/ugyyMELJbJLykxZijrgIhxe+LDFHnA96Qns6rGRHkWFIeDh5JD\nmkqNuf+KPyJSJYbfTt80a1+rSUyYSt+vpO2euhfMKirjtVNG7eMBqW3VTg+W\noNijs1cIi+AKvH5JfVUOZqpWHmlJh1o2lG9vw/2EVp3aLAKK2u1MZlQox5+3\nLlH+UuwpKftq8lTiRTQYxqgYJM7aIblUvS0tQi6k61k1tctyJ1d9oYMJfmpu\nn/WLnMVVHA7dfN47YggXmrKNppvucQ0Ooz3tBC2is3Wu5bCQE+3aZmYTF5a2\nfD2DIWVjp0DdTKHstnS93ydVIMcDplDK0OH9QFCMh2opEDOOf/D8E0h2haU/\nG7UKrX7Ngg9U4Ez4xZXsIRgSoUX9uWP/CQWYsgiT9Fw6+Y7gqaWoiqw/6G3p\n4Hq7\r\n=9r52\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCayu6QDKkkQqeBhc4F+UAZZombmA1iOss/8BSwVkIh/gIgZr42jJuqFofdX7tXgDJJUdAJfaoNLQ8dS3E1872x7Eg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-lieven.reenable-local-deployment.20180713084032_1531471547818_0.5068800698778146"},"_hasShrinkwrap":false},"0.5.1-20180715224140":{"name":"@atomist/sample-sdm","version":"0.5.1-20180715224140","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"bin":{"sample-slalom":"build/src/local/slalom.js"},"dependencies":{"@atomist/automation-client":"0.18.0-20180710131258","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/1491446391","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/102991291","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"a1027e67674a026e646ff67733f10bd067241a4f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180715224140","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-zwlA5RBcHaAKaFiSJv+bOyH+M4uDdNcFT5UGhGtMQTI5psY829mEcM/prLk6l0pgZ2zydMDg/YCz7Wke5EkLtA==","shasum":"48068755a52aebe43293f4f417325225a7715949","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180715224140.tgz","fileCount":200,"unpackedSize":651915,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbS87ACRA9TVsSAnZWagAA35wP/jndcMDjlhLDBCthlzL+\nps3ct1BNAP3rtCz8v489lylMTJS36U67dkaov9MywiO90iJvf0MMj3NlwVXw\nK7pKnzE4dejdZkheoDY2oAFUPSh+zt47/dhVTMY4jJZubIuwcv+8yv9UiJVc\n6vXALkm/F+DWK4dRhL+Yd2dzYOXVt8/EDVXJQXjWpnoZRw6Z+FnSWsEztQ5s\nZ0SNiFX/JYSykf9yKqdVzrDa00Vc3gstC/z1EnpQK8hhBWqcM1MHilHAUzab\nrj304eU6+IEYL+oFHQS7tUaZhG89me4iTpLnKd+UEZWgKz4/RGo+LFOzI7AU\njx40yjzu2LzlwnA59ZTn1EYLtM+2kPSM31YZX0EPckxRQcct0fcvRKOev3Uj\naZ2M7/v+cN+BBMbUvHlpwBm6duOOAfxBO7xNaSXtDEGRcPE9i6/yk5BtzdJf\npOObVVZiMXybhWEeq6HSVJB9tri3SlMgvLWOj35+pwFEmzCEw0MqaO03hCkT\nRQXuXBLoWyZhwxa69Y4N27QHqH7coHqWQ4v8fwqddGQnV51EoMYZJijFczLz\nnfjOld+11UGh7QCKUVbY8pSp17gZOZteeVCSVcmN867gK8Ev0ii3LiBVLvEs\n0nU50CZQBmtK3BAKAXrE5eTuJNpUBGf+ySe8goAT0o273xaZAqtcpimq+2Mm\najlS\r\n=pmvS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCrQdxCQETYh66//Ut06uZo8JkrIfL/byGYrdZpZZQmFAIgFAe4sWkHomoFSqfQ9SJDpea69F8GmVLAa6cUesbwhCQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180715224140_1531694784628_0.5743361796633675"},"_hasShrinkwrap":false},"0.5.1-20180715230021":{"name":"@atomist/sample-sdm","version":"0.5.1-20180715230021","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"bin":{"sample-slalom":"build/src/local/slalom.js"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/2996578176","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/120380251","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/102991291","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"454fa9ca41ebd613e9383ea580ac14cac91903ef","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180715230021","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rcaDfo8oOboT5HkVLBsOOBQmLBaJvbkTe9rPLqVTfAo2j7gjYENO+vYsJVMdKpnnbcYFCsu12J80u2ZkZ0lFCg==","shasum":"1a304be8bfb5b8ca6aa61343407482631a8dea59","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180715230021.tgz","fileCount":200,"unpackedSize":651926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbS9NJCRA9TVsSAnZWagAACO8P/0LjkSX975tpwiKcA1vX\nvnBv37UFVSf0q8GtVMvvaTlWgbzMMjo7lxV1qHR+rLQt6YdmwRp+36t1sTTe\nJP15EuD8hw9Mvymb9rzI5vGuMwo+belDszCFr3JtvbP/pJTu61MGk6Zq5PqT\nkejr+qofzu+mP/kdngthr316O5dSV/YaEPnDhWllI77yplmCfDoh4lNPahea\nmVn4vQQBxQ/wjqEF5cJVWUGN8AHUa+XNnZM5NXwPD3cKVRCxEv+3H5y3Y6lU\nemdZhHELQPsc0GRGDapRWsvgv244CBDMguipHZc2FoGq7wkMFjS17/Ab6QNd\n7LYvnl0yvrz/IX38ZEk040+gBOD8RKWU+8SQaarjHzjPMTs5KRHH6Z+HhbxS\nVbIFSDgTsINnEatqOE1eQEy6TS1TpsVmm8yxEgDYtXigp3LEVAccpYfgMvav\nIJIYP/ma/7Xl85MKf2zwGg7MiCYl9/wi/B44ZBy8Ot/CrvaiV1pDlbCwrp1n\nWGGKfaT968bFGBD/PqU73FSEP2QvtveqI/5WrbL+IRhO/5wRYTpMKgmd0Qid\nkx81+bZ14ncUtRT1J11cSZ6zNJYPS3QVvroQlqa62sDtdJzZlEDCc8f8hrr3\n+mkheZyTO607K+p9qDcOLnM7H8ETZTPXOYd/p+F16Gkaws66zgpVBQ++FYlV\nbHW5\r\n=QUBo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCTnGudnmAXvAw6iULMgE4+NH8m+1UjBVdjAlnBN10ePgIgd/lSXxQq8T4Fe0IxTKcahTvtPM4M29Bzuj6acAXKqD4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180715230021_1531695945747_0.8551295939963426"},"_hasShrinkwrap":false},"0.5.1-20180718011830":{"name":"@atomist/sample-sdm","version":"0.5.1-20180718011830","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"bin":{"sample-slalom":"build/src/local/slalom.js"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/2996578176","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/23759756","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/102991291","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d545bb3bb4be2ae0e4a79e63525d6191d0a70f62","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180718011830","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-M0Y2RGdJIvUYga4bWaaBEfH/8hUExsOH9BX6UQ9QrZLiHr8ZPozxHhMNyy8bwa3xHTRcATol3j9zTSogqEpHMA==","shasum":"ac01c7a70e857659451a6eb6be311cdf9aa2839d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180718011830.tgz","fileCount":201,"unpackedSize":651974,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbTpbGCRA9TVsSAnZWagAAfVAP/jQSmsloyd3wPXEFqG2u\nqTATKsyDE879pA+WoLOT40/SpnT/bGQofpLP4jLeQ3FpvMRsrOLXjwUHu9zB\nuwE+MyKax7veJ+ap23qv2E+vkLCRE37XiVERbJnz9Iw9KMWM09hfdyWL0jVv\nkCHV79ATkgbbgXSQWv8eOiigwbLWy5psNlyy+M3tLXPHi43g5/lHguCKgwk8\nnPAe6b6R03DIBxuym5MeyR+rrRzboA0fDKjVr9jJ90CM4VnT7rhLvfBhTt36\nFrbOXVcqfxz/xKbotr7n/93YizpDMc6vIAn6YsoMudx8mdFOHj0VwhqE3nQr\nzttoydMZt3FKPCMj4ls531Nd+oU24kxj1q/MJ1nDB5ViVGtewVVzsVT3IfPR\npzcLu3DyUbJ+OmSQJAmsF9TE3yqyrA7xCgalYR/LIgW5yuA12cT5kJKxsdiZ\nUI808hj+/8r0I4kOYxr+W/zxF5N/KRibbBUWBfyNiF8MwHbbXF5AVhmLukIe\nk5jjShxfPNYRatr30TVPoNR7wVJaNr96dVzr7alawqBlRi1piaOk85TWOfL9\nK3jvdYCb83o9SDZIkE4QXNDmvJKrzMW95/9y3OP1mdJpaxtnys89brKVRlYw\nNAHyAiVZSLBw+/vXOPPcmuU4YfH96AeohgcnPbWrGy95Oat0Wf+KGogVTx8w\n4wMU\r\n=ex4D\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEsci39sQ6jU2tsxVaTUKCNrTbwur3viuuX/gclYQWUnAiEA02RoF2ELXXm/n9H/LWn3YFPW67N4+345AYCXkWcRVQg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180718011830_1531877062010_0.5778956777749011"},"_hasShrinkwrap":false},"0.5.1-extract-packs.20180718085509":{"name":"@atomist/sample-sdm","version":"0.5.1-extract-packs.20180718085509","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.17.2-20180605032022","@atomist/sdm":"https://r.atomist.com/SJ7x_U8xBem","@atomist/sdm-pack-checkstyle":"https://r.atomist.com/BkHgvwf6DgQ","@atomist/sdm-pack-sonarqube":"https://r.atomist.com/BkEhZ1V_lX","@atomist/slack-messages":"^0.12.1","@atomist/spring-automation":"https://r.atomist.com/BJg-zHykFyQ","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/properties-reader":"0.0.1","properties-reader":"0.0.16"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"2.6.1","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"bd56f31369210ee8f271da681a210213322cd399","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://github.com/atomist/welcome/blob/master/runClient.md) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-extract-packs.20180718085509","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-LmG/rbiT54708r5sVx/1K8nndqDq1bc3MfVk074SwtFJz4nhz07mzh8820RSyJdD1xlmdp+w/ZvSXgTBW5vOPg==","shasum":"47e1b1839296eadebf1fbfc5ee8abdc941a754f2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-extract-packs.20180718085509.tgz","fileCount":249,"unpackedSize":574671,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbTuYWCRA9TVsSAnZWagAArzUP/3F1y2JWvuM+0/QLh/qP\nKLWRIZpM1/rmODp0cz88EEIscDw5/Py0CV0is8wwDqKVbDYSWTl3/M6SmAR+\nPaKUPkmsbHKeM/6aMKmDAe/z0QDefbpjnhghM4oOX35ZfwqtxN7Av4o1J2Tq\nzzi+3VcII5lpccBJZrARG0L9FWjjh8jQf2OhkC7a20zbEf8FYxReQ51LGnxh\nl0y1ItGw1o8OJ5sO1H8N6NOR+udQtsgkIlax0LtD5QIGUEzjI7IcCpu8c1WW\n8h27YQ6DtK/9pzZZROa/RwY7MoMw7dsIYGrMkIj/Kg7FMYp97SA2SAIGW0yg\nnWJq8CwE2lrD4N6iuUxbTu6gqWwnrla7Lq1WbriOWZh+YlUiAQvjeYvHl7Yk\nScUcP78SSRjNjKghqEY08bdXnLTzn6L5WdInUqTIPmg/f9KTT4GDBRAzhUWT\nyrNmVVl0/0BF3CS50B3C7wf4YFRq6vISnh1LL06/aV5E3cEtFzLMuGBZbJab\nePQ2KyYRe/FsjSd6dQHX7AZ+SEeh9o4de2N7h5BxmoTU7zbuM3j0LUtuWFog\nWmUcNklchIr+IW8Fnbd7weIXzAnGItXTbBnEuXQQO/54VZ9LpM/1TXUG+sLD\n6tBhafmHY6UowthuEVrMfFh1rUwhIPvdvGCx8cLHwoYYE8JvYobQq1Li9T5P\n5uO/\r\n=6U2y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzu6/4Al3MM11MbEkHACqWZQDkTIMaSfR5UCiYF5Yx9QIhAKCRLWKQyKXPhaAjSlEjfRWEbpQQJ+m0/Rj34pqwvkOE"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-extract-packs.20180718085509_1531897366024_0.8028052437615636"},"_hasShrinkwrap":false},"0.5.1-20180718101514":{"name":"@atomist/sample-sdm","version":"0.5.1-20180718101514","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"bin":{"sample-slalom":"build/src/local/slalom.js"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/2996578176","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/1304420101","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/102991291","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"cbd00ed1a41534db343663bdddf97096c9a23bee","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180718101514","_npmVersion":"6.1.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-M9Y5tuoFo+esxCi6YQl/5JH1U+o1lj3fTcl/ar0fHNzJOGZ0XoNg2gX68BadGJlt7rhAo9Rd5I+SNavhBRJV0w==","shasum":"bdbc7da1ad8c410c67d29931125622b7f13676fb","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180718101514.tgz","fileCount":201,"unpackedSize":651994,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbTxROCRA9TVsSAnZWagAA6GEP/0pMASOC71VsGs7/zuQA\nc9pZFHdhEBEvlHgD8rQry9FjGbg0uz8s2JafPtkuIr1IvO42K/LKTNTJf5M5\n2ap9IQLEPQQV2zjGAUTX8aZ2ZAyO6ttelzRwrhCH0GMTkn+5/6ZmKgXLvI3E\nqimBhnqIkVojlSlRPG1R8feQdg1u7CyidmPvuHNlEZNuB6s8qA0C8Xsbm3xn\nr2xdHvTjfrgbbvCK2FwR8nFjx8QHDS/0rKGwav61El4r4758t3E35x7I/b9l\nx2RBNcxds0NTOg9Q5i3s4xsv+zGfh200tWyZybDaR3TktwMjom2rnwDH8dy/\nE4jpObvA8MIUbz1TxhT39Tsn85hMAVrxPvm4l38j4rRWTJ7XyFsLiiztYf5F\nzTkJZ8UCePbFxhoeZmP/q4kNIIpxlhbUq3c4hcShVA8+lAVvKVCxD19YOmYv\nwGAH0bSM4uStPdA6W9Ap+WNSa4FFRvI6ZAwlCflfD5u3NcDMtZU1iexkAudx\nS6dqvVL452CK4srvw6ZVTprqrSdOBDh1STnlsWSwfNdjFHp5rjlf0takJx9B\nW9IiMkCvZ8OKK0PLtwSKrmqHPNQ7mBowXE9Wky5sm/bZ4VA0he439KfGwHAU\nlFLQng1o8mMpIyO9rGJF6v83hvboqMNV+GyVcksZvAa3phgyhOyvhvP7Suyu\nHIdx\r\n=ZkNN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDJkWPwJaT8OynMxa625wQD4tXV58MhDSw5VYXSZZvfpAiEAkCGbDFkYiGUI/oz1TPjBDv9J1XELiX+MxzXlVzi/HRo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180718101514_1531909198897_0.9413806864971761"},"_hasShrinkwrap":false},"0.5.1-20180723192721":{"name":"@atomist/sample-sdm","version":"0.5.1-20180723192721","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"bin":{"sample-slalom":"build/src/local/slalom.js"},"dependencies":{"@atomist/automation-client":"https://r.atomist.com/2996578176","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/1304420101","@atomist/sdm-core":"^0.3.2-20180713022755","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/102991291","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"4c097c8ba386e26b2cca4a8e900241c9a9bde807","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180723192721","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-QGNFXYG8z6G0Zp0qM+BrQxstzfI/UK0Fw5mQv+WwAIA6G2taOqV7F/JlBtBJxJvwXysy0zW2p3jzv7fNpYAjqA==","shasum":"70623749f0aaee531733b6947399ce0609b7c62e","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180723192721.tgz","fileCount":201,"unpackedSize":651918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbVi2+CRA9TVsSAnZWagAAwQ0P/147qibT/JUZ2ocsYiO+\nZn68hvC+1RYWQxt+9gR6MAJoDH7AoEljSH5Uk7qop8YeAXj8OpaI9CwLNm6b\ngHHwQBW8DQJBW3PgojoLU7wZF6j/Desg5FZbyX4rtczC688PlcmdgbRkMA1a\nVZjB1ZqSSfzEFKqVzUTC0/oBByBxTZA+32J+pwZibWLG9p7c4KPTu8DWWDs7\njivOQaYpwtlR0dUk4TtEq+05U0eVIod9suSwZWwrJg0aERcogtA8TDwYngbj\nE64aZI+qBXtjMWuWg4bVJuUQdphpmEkgyozTEGv+MRyZ4PRiKgKHLb8KM0eJ\nkGi9cg9bXnRYSADA3B3AJ5QYcaQqoxlFX5F7DoY29U1g4vQdqR1cN/xBmMWR\nrPUzm49EToTHNohePKDhIL64RhbTeOtiDvufaY+lpdPBFl6ashdDoM2j4ZEw\n30jzAGG6URSDLCIYoIu6848QO0/AL8hAYOCStjfGz8F23aJIcW2XmKZk7Ik4\nfY9n89CZiD1DXiJ49z4bS4dYcr3O9cuyYIN7WkPjC7KfAOqo557IA2pmdTm2\nTcwD9yaxP63LEoBNspBqdetvxohOZOnyX/mMJrqwZg02ECBAUW6JgyfnRtFd\nl2leev5DHH3NOH9RVZcZjrNAYb2JuuWyQ13MnRT3wCvu1oBMKCbXo+9pin7s\n/L5U\r\n=xfYc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB4JDl3mfjbxmtsa08FpT71YxZ3cD+hOs9l0BwR4lTIwAiEA+gTTDD3JdYQVJXOIJitL0Oiv1PLcbtWo9race3zgvb8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180723192721_1532374462422_0.6755063073110847"},"_hasShrinkwrap":false},"0.5.1-20180725114709":{"name":"@atomist/sample-sdm","version":"0.5.1-20180725114709","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.0-20180724234011","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180725024434","@atomist/sdm-core":"0.3.2-20180725080039","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.7-20180715090742","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6a3e6db1966a69d999e5c54f7741b0db5190d69d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180725114709","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-/zs34isI/7BEaX/CmhG+lva6v4FnS+/LbLVwEu0VuFDOjgDEfKVmX2nQHC8LDDCYLXcPyi6MF/FPZ69l243tgA==","shasum":"058c128d6859fd7faf7e9bfc8c786eeef13a853a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180725114709.tgz","fileCount":201,"unpackedSize":652762,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWGRxCRA9TVsSAnZWagAAgUsP/38YRYYBBlYomgWV/ZJG\nr5h0SgKZ0wGQMsVISub5i0wORqbFa181h0hGirI15gxJumLIBZZAWeSgFfsf\n/C978xgyE4X+KAXJeSeeOkPocyxTdxolgIONUNaJdO5IjCDO5HJIRp/FCa1n\nl65r92WQm1cKvieVhLtFBRPRseg2NM/+HWWcp3kVj0yuKaDUlch8okpgbYJx\nUlKYBoiuegoOjsfNEKwjKra75YfhTqBG8qaxkJ5SI1XblyIbMFehCos5EB1h\nGvBvr098bSClDvJwv2ZYEjDRC0aKFiBYpenpQhWa/jCRNPnbZvgc4S+tGx1k\ndt2yh5dfiY2gNYuq2twp2TBbceOSMwO+s/xRUJSyMKkR2jsvSX+I7Y4Bd8Wy\nT6/AiQnQl6WyzAwDvXFlB76fIbE0Y9/Aucjfv69a4Yim7s4he93MvIo7zqVA\nn7kRzeyudo24us+U+xvZcR5GDLUBBqJygW1vTaBpMwYOYO3KNcO7KnVITkpP\nZhDsT9Wa5WHOlIrizzLrQ1TO2E3jWac6EOzUVONAW1UxnKvBGGXqq8IEUpWc\nv1XraLycYc9dfOP3b40p+MMMa8tgBO91/jSg5KnhFqiKnE5Y3WS61LsX5VYp\nkRyXo9LFoU/6GPMyP7YJTChyCx1DaZ5HRBXwmyTnS+PUfeSqocLGMXrMrTPj\n16vJ\r\n=KI6E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA03hFnMqSW9hrn1lBiB5jvV3y37MvT8bhMsoa87r9XIAiAmgBV3HKAR78QfAXOm2fS22BMAEr/HcQA8Vm6zJ7BooQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180725114709_1532519537096_0.2768350427134003"},"_hasShrinkwrap":false},"0.5.1-slalom2.20180730184514":{"name":"@atomist/sample-sdm","version":"0.5.1-slalom2.20180730184514","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180726234320","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/sdm":"https://r.atomist.com/3191594031","@atomist/sdm-core":"0.3.2-local-configure.20180730105908","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"80b08d1e8de3f9a42e4ee4a88157cbeb6e79c19e","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-slalom2.20180730184514","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-UsfQ45VlNN4Dt9rs8uScwx3pbeAXBUPTpd9QMO/E2t+02ivv0h3w9XNoVzORILnHXINowQM0DPmJP6lSt9/1mA==","shasum":"f8b14b55c6a3d5150a7ddaa4e3e0c281dbb838d2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-slalom2.20180730184514.tgz","fileCount":204,"unpackedSize":670123,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbX137CRA9TVsSAnZWagAAUMIQAKNsfilFchmOm1TIFBet\nt3h4svXjiAE3vGfUkoGSOZOy+ydWlzlMx4yT5P96skatHkmXyyFBkPg+g7Ks\nE8KYvKkiARi/KxtNh1z2SAn0J6BDs8uRInRlh3tsWqTiAthpwxRKy/fvQrAJ\n1WF/mzrMsU68RPAFYV8Im7Ukcgla2SCO7fgp+d8xiTmlDIEFha/mLRfLuCV6\nIL9entFY+Jz5lCIsYHhhJYfoTO6F3oXTHuD1KJ7Oo1jJyympGBviFhErWuWE\nXRYMWjZptyTcaup9eNIHQrmlMUNujOaDr92a3B2GRnE8AADZApwcI5TtrQOk\nElnoRxcKq2Aj4u/jMNDULjLghgkWIYqN0P300o4dIyHt18SQU2RAgy/ebM1t\n65xzAm12D8qY+QDRq4qTp3uIPOAat2tF2CCwfTHr1fVYAE+byhN16UFTJAT9\nZXibYBcS4H6IVEm7SKHGS1EVa18Xs5Bq6TJxKKr1ghpJIR1UYoCe/YOLJNQO\n9r/SwtyfryKQC3I2hYUyuvRR0rOVSoPgx16Uq7DJ9Co1AcGj+fmJ9Kr/df1y\ndOaccj/9KRSvxqIj+4XWT42O/olG7hNxLlUkA9W1Vqtc7nhhwLkyHJRrYPJY\nJFkjj+nLOnPYMqFbGKQWu10MDiLmrLHSf3cy8jR0nqk37bas5MCceq04attK\nLPkb\r\n=c3jV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHKYK5QqF46BUCS2SCpc3DqVgKlRCB9eGEbTPShsnvamAiAa4Ng/U/hdJbyXNJoU/8UXi/4V2FCtKrKIumBOTS1XIg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-slalom2.20180730184514_1532976634801_0.6023191124856879"},"_hasShrinkwrap":false},"0.5.1-20180730210934":{"name":"@atomist/sample-sdm","version":"0.5.1-20180730210934","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180728225753","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180730010005","@atomist/sdm-core":"0.3.2-20180730094924","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730101702","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.7-20180715090742","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7b13368d469cdcc86602933b5d67290a5d763c6d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180730210934","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-U0iTNjhn+b0qV981tM3NzDcf4kTeSVI3goDxCNp+bgbREyZ7om6TQBdmtUjD8mzahHVYXojJK53+RuqZ16yKyQ==","shasum":"861c20c0cd7492c009675e8253eb8c6fa002ed22","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180730210934.tgz","fileCount":201,"unpackedSize":652401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbX3+VCRA9TVsSAnZWagAASh4QAJyaLH9lh4vvy1J2t53y\nm4wJw4YqwKMpVs48tIZviqrklDoQs0ueQRggmabrOj/tm2kmrbRFNhCmKCay\nvjtRJz9y7kH0OWR8ctOZaiJom/QOxxgPmCdzcKGsAI/zEVhmYTXzMLBFJISo\n9s8RRwEDuf6q/7pcUF5mow3QZHtzzH5H+tCvf3eS+0TgVmhyseY090q9Wqln\n1o/45rqBDKYuOX8Jnzox4fbmuiRxB3nnha7wvxdQSOL4GRb8KOZ1eIYipOOi\nc3akQqDm02PhXuEfmHaJdA+1EFbOwVDG+4WwSqRnn5cEYsSYUSQq7AAO7SrS\nFSj5mTaxj5uCs1RIjSrK1+GLeYMjQ4/6m21FkEXvA6hcsjJjskjiWhDuD9RN\ncI8kXnGXFaDeRCiE1fDGNI0CJRBS6LbHKDIkKTXgMiQNqSFASrcMNXc6omyy\nqxuPON40PhZnkr5hUC75SRzi7FWps5kR5xTy0l+RHnMM1VuSiN86icoJhEoF\nKz0S1FEM3L7XHmYg3wFcVUigrOoxnu+bCXmjxEh5SMYHR+ECPTKMIfdjp6UH\nhPHD/2oCWWJ9icIQwEcwzY7HoLYi1FEmHUWj6SU/Vw8Psy6ljzGIK4cNyfql\nRsy+G72sAh21c1AN+EiSGvAAdknBdjTs1+IPOI1uFNUtqtYZFNRBTzelwTOZ\n5t9g\r\n=BzxI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1KGOicc6k6aKhKVvplBgxg1Swqmf6ggXakbCLSFzu4gIgQeIApJbpkhdwzduxLOnz7yTxeHwMKc4qFCGHZg3ROic="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180730210934_1532985237178_0.8901545066254828"},"_hasShrinkwrap":false},"0.5.1-20180730215420":{"name":"@atomist/sample-sdm","version":"0.5.1-20180730215420","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180728225753","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180730010005","@atomist/sdm-core":"0.3.2-20180730094924","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"0.1.7-20180715090742","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"7e2eb0ab085a6f6755f5d756235bbed5db17846d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180730215420","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-YQ/uluDsA2RAnAXOrUoKCCmL5rKAVUZe7/TEz0O4CGmcLl6OyEULdkU0QSasWpRlxY58TzsyHVwNuJH9TlsxdA==","shasum":"b353bbe187d1c085bf5f94eb51419d57033bb721","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180730215420.tgz","fileCount":201,"unpackedSize":653218,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbX4nKCRA9TVsSAnZWagAA+uQP/RzN3GzXYoAl/hxf8bky\nnV7tZmC6gkXNuY+6XWZAMSVRSsRRN9Fbyo0x8eGiVxrxr5plvmXwEAEHyxzi\n4L26P66UCEDcL7AFnifRKJEbdeMteFjJQBxuVsUrYCCzFrBtJSCkO1tsgNjC\njdDS1lApIum9Nr7UPLZsN0cX2im6hSdbJcExNqpEv45i31Nl7vcOactKh+OE\nErx3ylR/sl8GhB6buBcLjrsMMghjsVpiO8vdTtl3d92PDZx7E6YCCShWgGUl\n6M/0lAoga5wgtpvZTx5tJGAcs13k0zLR0b8vh9meK0JPpsNxwt/uryDRJ1FX\nzlrFHsqmQ0n2j7aiZpMPcZ7jlX22zvH9lHycymmOpIDlElkOHExldmQrs3Dv\nA39bY3WDBVO7WkWRQUN9lMwfDZIaQHr8fsqFiPhehK36+rDFLQPCKzXdCtrl\neQrqPL2s3hG0gm8bRRa8Y8LRwfH6Ala/KiXZumRz3wx6MB8IIlDNPPxls2b8\nv3y6zC6cYCXWj2s9FVld2SNdw0teJVp1X75QIOfSXBE2/x3Q4hMNthNPdfQJ\nI+tMdcLt5fM+RybzKTV0ndnzZ3k3yaxR1Ldx9kJ217og9tDVFmuzvYlMnxIr\nzaAEZ4CLjzztzEURlQqVR20PHZby9lsWfu77IfXNfM9cLQfO/IaYAHiimOYL\nNdHp\r\n=NkTp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGpuCnADr7q0i/UZIjyLYEkh6bTde5zV06HJY04kXBX/AiEAsq0CtOLHQKhjHZ3EbCZkYPkBowlFWlkIxRCAi1NXi8s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180730215420_1532987850595_0.8405736219413016"},"_hasShrinkwrap":false},"0.5.1-20180730222732":{"name":"@atomist/sample-sdm","version":"0.5.1-20180730222732","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180728225753","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180730010005","@atomist/sdm-core":"0.3.2-20180730094924","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"2f11e5417fba0e7537624d7301862f0545ce445f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180730222732","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-dE3Udd3FmNdMgngR7Zx8UHEUwYfu+s+xV1IMgOSliPGKfGxv6GK8XpG+eaZBOxfiUzoEtz8SvOl9ZVp/SqORAg==","shasum":"d2acaad9798ca166791dd6dacb25b90dfeb5d306","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180730222732.tgz","fileCount":204,"unpackedSize":673054,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbX5GyCRA9TVsSAnZWagAAO5YP/1OAK4do+f8ZGp7mIsmv\nmb1cWz1BOMkPfHQ3IE7oLAkIktuO2/k8oCgiDJia7SP0jtvMBzl84ayRq5C0\nPBKLIDzjJ6VVhNz5b7ZFk2bsoMtxjtZpJKSx+12pJbWvPrbZRvdl+egIVDtM\nwX/cPeGTSAap7IGRWJJGFF9ohEASgyfW5WclAulNKdIL7NWfmO6Na3LxUhhR\nUZOtsWvYLXqY3EEVgR0k/Ul1rvroUsEfasUy0zQsQmdbSSOTrDM3G6r75qSH\nQU1Z5LWMT+LPA0UzD2HG88e4uXJfnD0ChUhXGksPDF4d+RszeH+mbBRl+GRK\n7l4X/7KqEOJ81LvLk1w1NVTteqtGKFtcZbwaV/EsQcJsiNHmtWnjUtenBt7p\nkFYZT2+BDLg/v2+uYGvuInt4hHVwPK5HBHX8ZzhwpetovzF+Hn+1kOTlZb1u\nMnhg+yfVqJVunQs+1DKtjDoVsXb42xf0Qwj9R3rqfDjizOwxeFI3OV0WiWKN\nLxZtz5TaC4cHSOEnYyxP5+9RHps8Ncrhz9Qm1Z8DFJoH6C1xiIfSHT/fXuNc\nKmtvPZZhi56qW5iyR9z1bT8YrAhRwpZcJlXD1tMIcXcFP/0thELsfHvLYDsY\nJphSsiJHe6eoz1Ai2zAj3A3WAx7Zqhuspdx2lPCtzGlttNp3NNtYTf2WPTHQ\nxFXn\r\n=4Rdr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCx0ndtVcH+kQ4OXNzS/MdI0xIX8TYoc/3y9y0QDOzHewIhAMbTlSrgQhVpb8GobNJf4VTGJHRFZQTzsyV/BHl7mlQa"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180730222732_1532989874696_0.3731983243098913"},"_hasShrinkwrap":false},"0.5.1-20180731014217":{"name":"@atomist/sample-sdm","version":"0.5.1-20180731014217","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180728225753","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180730010005","@atomist/sdm-core":"0.3.2-20180730094924","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"a8cf9022d2bdb41f7a8a582679c6c565db49e6a7","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180731014217","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-8z19vbPmG+xprZ0GcxkGRLBeGGdTZmNF+QaZ40F9CE6hL8roeC0NKew3itnFNbsO5hW44E1V552vViqhD0zaMQ==","shasum":"e030d1088d718d1b1a0ed7749be3c91c5081f210","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180731014217.tgz","fileCount":207,"unpackedSize":670431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbX79zCRA9TVsSAnZWagAApI0P/2154H6mnRD77xA9f7rC\n7wz2BcYQ1T3m+ZqUW2dqqsubS9nnMMStRHn1kJxL6HmMMWSulN6q0QEgEANy\nQL1AqYLLzhikO0VrkGkoYzuWrhRo9lgxs+jLlh66Cg6E5ewgeuOPvzRnFhV8\nEfOzV8ILXmjf9WtbEQGkWhbQVwYMKh1K6IYT5nvNDcHvU/wgt5bt25fnq91H\nGfHCYc/+82r613UuXtdNYHo9Nwo7CFG/jceA7+BOiPXEidQCv4O8ZUyZ25xl\nqDRiui7H3+WKsIg6eGgO6EMmGm/wyxop+jpRF9gHj4JXPNBGsJfMoS0m/nva\ntTGaBQYYdZGYn7ItAxtfw1neuXoQoRq3P0vCR8vKDmDkuhuFcjgN6zD9+M2o\nT1MA4igSUcQ7woMd3KPvQf9uXxVcA+1ZxNAgYvBqy09YqF/R0YVgy//HzWWC\n84iEw080zLFPg4OAKj0fgQ8CZM1jZ90IxCitFwiqx6jMPZGUZmaJfoxA04CW\naAbS8w9+Pi2m2/Jy5cfCFCNhwZesmAmcYKM8qB+8m/kKVdYn2Bit3rkc69O9\nE0HZAIk3twOPc0zhgtRdjm+QYUAjNaV4E5oKnDxkeZ0raRDa/7s+csYBK52g\n9KVa7ptk+E/XuNIiGCWyH3dKsAbPmVz9+pgRRPTsfcWF5ct1HbvkEKWS801y\nItdr\r\n=u/B6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGsXWDN9OwsUyqaspwhaaGGoHU08Kp7LK8KmPxhIkwtIAiBq/PVoN9Uo5FikfOEjESMBG+Wie2r1cb/97PE8Tvt98Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180731014217_1533001587162_0.7615991948682264"},"_hasShrinkwrap":false},"0.5.1-20180731015205":{"name":"@atomist/sample-sdm","version":"0.5.1-20180731015205","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180728225753","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180730010005","@atomist/sdm-core":"0.3.2-20180730094924","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6eacd79ff32eea5e5a038252941da65a318c50ce","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180731015205","_npmVersion":"6.2.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-NfKNsmM3JvR7QqYrP733WMw2tFvzpgQVdRmXmfjcUqMOSjleKtRoXnvyThDmNuhxPIJjlJKe8cR7Zx21No73UQ==","shasum":"5cd8291d8320b4782485440701c6dbd3d73cd819","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180731015205.tgz","fileCount":207,"unpackedSize":670416,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbX8HUCRA9TVsSAnZWagAA1HoP/1pHrrtSd39KiqC/84kZ\nlm87Vqx2mG5Y5IviITrD9QSukKKSzflqvQ7lj6nUAE8udDz1xtMfLHCcr2yM\n5kIymIlGjWhRsBUlRo3/VqRpmiTaywQwI99ui8rjvUGYjLkIydjsneykZGC3\nyM/48TYhs9V6yIha+gUWl/cfNuuEuTYJIqocYc23F0aehkrBO1qFIWta/7vF\nxtx7zHgWu0e6DP/VV87GgV476Dcpcugc1x7SZCftKt4z6QTF1Q8ZU6aNYYPm\nT1f/5pYa8uAwHJosm2z04jYIyXBv+RMa3Gf3MKQS2xRSv/n6JMUUlnqaWorB\n3Llbm7vHW2Wi5P2T4vR5bRUtpGqBgeK9U+FZ/8K4PiU3yfk8se8kNSPiJYiC\nFzp8nL9tpbUmF7ZLD6L4DkBiEh51vMDETfEFWBIMT3hWPBqZR+QhDlMuEWw2\n9b3vydlQUhRkSsbfv2eeTHykG+zQNvS1+j4QPdRu6CZGix3frCm+KJK9TKgQ\naBe6wjCLUglGebK+P4IiJvupM/y33+jMS6DKPXalhepy4pgK/URIY2sjOOrX\n/pqDDIbiFMo2x44JDbe3KpXdRWhRw4x24lmLLNGwkU+DUqRWNPCtLcjB1ckQ\nYNXc8R9WGmqKUnLMO/z+r99a+43dpKMuN3WbLKHVA65mSqdaypV5tRnpf76w\nKoP5\r\n=K3OF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAbVIFNB+brYrkoX57N8y6FZMiNLf38LKLFDXVI10wg/AiEA/OgmME1oem7wc4/HGU9cQop9JzKYSVz8eaGoJ3GHsEM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180731015205_1533002196614_0.47937572827186536"},"_hasShrinkwrap":false},"0.5.1-20180806044153":{"name":"@atomist/sample-sdm","version":"0.5.1-20180806044153","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.18.1-20180728225753","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"0.3.2-20180730010005","@atomist/sdm-core":"^0.4.0-20180803134335","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f4db6da50d786211fce0d0f870787b4052edff1b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180806044153","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Wc3JRKaiA97mSI0V9O5LIvlctv/Su7CKGWjD1vA2pvEGVBMZ9utdbMaIUdHGmVEg9RB5jOfcJCqaOSd0Kzanqw==","shasum":"c8d57e23c4e1e2416e13d0ddfaa34c106101c9dc","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180806044153.tgz","fileCount":207,"unpackedSize":670429,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbZ9LDCRA9TVsSAnZWagAA48IP/j3VklmoBLb7baQ/R0cF\n+Bqh7K3K1BEt7OQMIC30WN/VuHOwspUwGmIYfyq26GFQ314z2njwNIfzkqQl\naQ3GbHUSsAvMXIP0SGa4s7mpHi13vYPGlA2e1f3TGteQbyH7RxFKygvU61Bl\nRyyhHhQeSwu3zFLSjNqDjEahcX4ytqip+KDMBGQj0idf2zfPRg/SwQ6qAhXh\n4xUx8ZMo8+n8iGzE7iXALC6rqMAILarC8cFdHIj33FY2GdgZrL3hMQWQQD+W\nAuPhKdqhuwFGLl6MeyFfDBPs4t8EWamDPVvCCn8zsNFudKlE9DdTNnNk/Ub9\nnWbfb+vv9++m8diBHn329q8iyLcpXyiFLiioDjdR10XkkhwkCyRHkv3tF77Q\nCY8GRY2ImGZNnVA/XtGQSYb5cE28IHsRyGgaTM0NSoPR39frODjp/os5m9b6\nqwJB0wla810x9cKPh0bYHYmPDW7i9lQ78tfjGCMJY+02aho4LqTKKA7RPypH\n+J5+Lqx1XWM/ekUYlTszzIVJ+G8dP6DZupBukb6xQp3Ma3+YgXy5IXyv34D8\ne8kzgW7hMch/X9BTb6e+uWHr3W0K+xNzU04k5P5swZHM3xTgIasW4D3B8UmL\nquYR7E1Hj9UzPSqm8kVkgxRBCrZRyAr5cP6sEgGWj4W9v+sBtlRZ5762QsAh\ndMSr\r\n=Jq8F\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDET17zQeTUFqae2JTGJCdiT+hkvVXiEomA9ylD/LBAVgIhAPq0UJSWjRIr9ZKXQ1z94VXIXJbYtqDV/u67tWLArb/4"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180806044153_1533530818638_0.21748107584657728"},"_hasShrinkwrap":false},"0.5.1-20180806052143":{"name":"@atomist/sample-sdm","version":"0.5.1-20180806052143","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"^0.4.0-20180803134335","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"738289746dc2d5f2ff0c65b375d62b9558673230","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180806052143","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-vxudqLlukxoknFT2O6SPaFAqSURoEj26xiAkn9B2bRicZdvf/kllfUODWkvh9wWpUZlcbgPW4esm9jd2FzdqRw==","shasum":"adc7e6d8dd7f27ed7720daa80b1c933d3f68daa3","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180806052143.tgz","fileCount":192,"unpackedSize":648133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbZ9vgCRA9TVsSAnZWagAALEgP/jGL1ntso2GRxS6nYCMb\n9glmQaf83ktFIVHA0EWGMHTvVAwy9nPau5RJpufyaVgE/HRH9WfHtJOx4wVc\nMJxazyOVzPP/HtvzM7gSY1Fl+tD4lCIiESjxBgjuxQ2RbuxXUxE67WHRagYs\nFKvo7TXNGqjQDx6zSBHpKZ+3GKvYyCMGA5AiXq7U2tAfRbAlFdp7k20EtO8K\nxCN6yBgF6LCGIc1jJOnR+WZCz5RSZnPgtvnf6CbNcsCPU0A8+9/BKw1NSTAk\nbW85UU+9S3YceUuiJE1GE9v+7U8ZRax2GwenRYXjPj1hO0mNZo1o2vjqhn1m\necqQkosB+VsPXxTEOWoDbsTOTpcLYIDhSHc/L2idFkj9IuzQtemoNSacSvwV\nJTWZBwb0EunKE+azJGVS1hgcZeSHkb91O1XWN9Zj6Eb6Fnb/Cdxt1QyF5jh5\nzTn7zjRq8Jh4j2Ch0FI89oLz+JBDTUUj2cg/HGZhkVKBpHJ44rzjk58n8ruJ\nQxzCLapOWb9L+3vdLMn+RO7Gpj/ONakfiI2u8jB9hHS0plR/LLiBT3RPNBVf\n4WuD/1a4HdIKK5OTSCFwXGL4kI9pCsrogu0GELpCCtfvBP/8981snch6aIvG\nFkI2ICZM5+8Uuwv5m3r3S7pZiwp+aporN0KPYFmvmh9PLjizw5vMlA0vmGbS\nBrH3\r\n=PhOL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICu6asLfs39ymKqv2d+sMr4B8Ll4+pGxSuSsJQuySQmdAiEA7BpMi8zQoIS7vK72NnVxfpqsW1jqWV3yToUra6h2fFo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180806052143_1533533152129_0.43370588036080093"},"_hasShrinkwrap":false},"0.5.1-20180806053213":{"name":"@atomist/sample-sdm","version":"0.5.1-20180806053213","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"^0.4.0-20180803134335","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.8-20180728181050","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"989f7e93bede2b2d8594888cf594158ee0abd95c","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180806053213","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-coEknzF/ZKHuLs7jDJ3PKEpf6rrgtCmeKB3/Cf21eBa942pmwb/wHczLj9H3GuxgoxF0qJrsbCgpluFyHZCZ3A==","shasum":"da9b1810e3bf8d098da754957d3847d5d3f7050f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180806053213.tgz","fileCount":192,"unpackedSize":647916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbZ97SCRA9TVsSAnZWagAAWRYP/3fpUuXwGkclBlJcD3mw\nSyAPS7PI+M/9p7ppeyqfKfQ6a0j+CcgsirT+UrA5HIPPSkGz4lIzXgGqJWuW\neL9iNTjWsf2YFgqmCfGBA3IFveu36o6aQQV3nes2AXqP0CeIPp7Rzwvl2coe\nc0I/ySWIk9N531pWJBpBn0wRrMfwIDSHSuvOjaTOywcjAMlJjekjkDNqaxkb\nPMt7Am+vThq21ajL8iLz/+ig+aUlpFpS1L2owBk/crihATo5RGzaICJmdFgk\n93i6lVbKCPFwtCHUIt5hF7FSYEM+6ZDuQWb/f1f96zqcPWW80TSq9SJ48zoh\nBdwVMjtkgxsX+jx+XFRM/Af3Ay4rvzoOHn5K/WuBoHM2zABRbQPU8BTOs3qE\nVnURUWYD9WNqF5QDycqNu6AkoAX9DjxaIxvXposgR1SCKEgoB7DiKHay3CRy\nA7s357z1osRTCr4JEW4tKwJPAOPCbiuULYfggueBgRNLus/Jc6hvjgxyAjXx\nSeKDdSwXP/8jAdrg3JPjgB8tQdXcaSNA8f9T+7jgTz5TJ2ehFfnMLT4IDuE0\nRrPc7rZOccAVmHSBEj+aCNK+jx/czK3d/vxuQhNwoxKZL0796TG2KbNpJ0vK\nvWXPISYBEbpvbk1w7V7pGq4G6DKVmE6X3/gxfuK5B+e2j2xoWDVh7+0iYisl\nkbNd\r\n=9am6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB9dhH6ZgO97zZDS725/e8Yk6ldpgBPNY+VKamD90+rBAiA22t2XaBIf4oLJw4JFae2KtQ/cCg15tXfh1eXziwujHA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180806053213_1533533905609_0.2687015650632463"},"_hasShrinkwrap":false},"0.5.1-20180806073442":{"name":"@atomist/sample-sdm","version":"0.5.1-20180806073442","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"^0.4.0-20180803134335","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/188497071","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1897a89f9620babf4fbfb166686f3164dcd57be8","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180806073442","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZoAsQ26AcNdivWY+5w0cYbIcq5OGLnLP/SNTquI6Uf1NEhUXQQg9lmB9NldYYKNNeUp+4OOlhmJEj7pCCI96AQ==","shasum":"2059cc8ca153dff15ff5b428e98083beca86768f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180806073442.tgz","fileCount":189,"unpackedSize":632814,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbZ/r0CRA9TVsSAnZWagAANeYP/0mSROfK4+4fsBmuUFVb\nL9Lyf9xDcj3ChlfHe2J8ppn7YiHov1Y6vjAD0L6eIYE6UZcPK3A1UXAq0sw/\nUEKboAaV9EIVm2PtiNInQ/hjUB7xTvXd6Ccan1nBmgtDL3mBNhGfG54h6iRf\na/wHtNNm1GIkrpGcjbZPd3o+J5no6CwnoCgC1B/ffsscRbfAQFdB5BXSEVFB\nzXcGQHH91GSnTgAMOfr4OlwkgsQ1E1CfgGCtZ0UjOTZHvCgARuJ/8b04HVI/\ndjY+p3zmA025h8G7RrNPCIQ1ooqpfw7fTb6EG9ZY14+4RCYNC9olzEz0VSaD\nGFeWLMTETJKBEqKwYH81vEh2CN71xuOMBWyN7aGDPhmzt9tuWSkVqNiSD6S6\nd6krzgg8Jv9zZqIVJALTm8lkKrtNwSvNoQjdLOhwCT7maFhGqvUg4d6SurJ5\nJ5zekLTSawNfZqYxoMm/E87IB8toYLMoM0vmG//65/iAVhzCmG3JO6ZaXhi7\n7vPqs4a3Lbto5/4WJxCpBjXdDLOIXrxj+S35xbzRQ3bynCpVgq/FpMiFG5aR\nes+vpbJkO1uUUxn+WQwxSTxxi5XEkNpsFTmUk3zGABHgroZ8bwLAfSQK+9tJ\nArdij04xymOxNm6l4vwY6W11oMmDCtJttYRmu7vwoiuJdMR7vkNm/484UPki\nPC6y\r\n=4+kW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCirmOm8R5c/NhkFHjfDkThjqBEgBfYipJ+J3Al2mXlIgIhALDx4/jGxkXgUkL2iYlyi9H2LddmYr5+zM73VtI1BrN7"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180806073442_1533541108368_0.04432814418196407"},"_hasShrinkwrap":false},"0.5.1-20180806081018":{"name":"@atomist/sample-sdm","version":"0.5.1-20180806081018","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"https://r.atomist.com/2271969078","@atomist/sdm-local":"^0.1.3-20180806075910","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/188497071","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"51425accf51fecb03d892fda6d228d154c133e6b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180806081018","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lXCbG5LtRd4eFTijrM1CJ592IC6SMAB4InGBoba8xs0ziN6LEr3p5Lc13K6uKXIdSjaS7YEFsJKp090gURfptA==","shasum":"5d262c11296c9a502d723d8eb3ff0026fc7611a7","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180806081018.tgz","fileCount":189,"unpackedSize":638661,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbaAOMCRA9TVsSAnZWagAACm8QAKGT0CumYxsQxDF3+c6D\nr0zfKUYOioevNGNqaUIGiPUzjhnZ17CiHcfdkaxck4yDAQ/7Mxp9iLfQENYQ\nnHdwgbFrlK2QYykQ1/0DUfkdE/WROCHncK89AvWvZOJoiaiVLmBJ7LCL8H3R\na/aD7LsvnmhjNlJTQs3lWMhF3TY6k6JoW1lMp+8UGJS2QbdK7vG4O6FC37dP\nHloZqboRtcKBqRk0jgG9V/zkP0ywG6rxlEX6+LFOjcYzAYHXQ+dOnJKhOkdx\nZcVJOuNssfh5GMmKMDHVSxtzH6f6kSDBsH+G3b6eKLURTQpSb3EJ2SUEnDhj\n15jXcLbfoALl5U+0Rnf1O14N4U8PIEgZTzbiG1KhvEEGCMIfblbhc8GUuKWM\nLVNclp6Sqb+KnZEAtm2YedKYOpeFsUvMBcYJWqSf34+CMJeVUhusTxB2RLaU\nrYmnERKR73kcIXbG/WX6qadM8Ipnplj2aMlkC9IKjy/owRG36OZv3iY8RaIF\nWJGc5SORfo8ct2iigbvewqrCjjPRelCz/2E4r2vOJN2Ex5wu1TfgvvlFERBM\nq7pemfdF5SgxXGAhnqMDJfqVaDUGk4+kXrd3IZuoALI9XwF1mgHccxM075nA\nYhDcr+camGxIoNL/K/bbqQLG0CqZ7s5E6z8YxzIcBQXbpJo+6kWeZE+Xu9Go\nVGps\r\n=o43P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvg+I+blFhLAmsiqQGaS9cgeeusH7ywVgYUJnE+bEy5AIhAIHqYmzyEAD95EyfdlHBBUXtsqo9kw6n0mp5mYYyow8v"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180806081018_1533543307995_0.7135924514017284"},"_hasShrinkwrap":false},"0.5.1-20180808084410":{"name":"@atomist/sample-sdm","version":"0.5.1-20180808084410","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"https://r.atomist.com/2271969078","@atomist/sdm-local":"^0.1.3-20180806075910","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/188497071","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b637b54459bd200f266faeafacbb44a3937c2d17","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180808084410","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-GV6gdhjxmUdVBpx24fC+MF6Imr6dflYZ41tWibeOPTuPmUixKpYehOvd9J5heL1rbQjYDe8TNPGZEWxKXgfzag==","shasum":"c3a0ed182361ab83619bce4be7db97f39eb97d96","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180808084410.tgz","fileCount":189,"unpackedSize":639154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbaq5sCRA9TVsSAnZWagAA0mwP/0WdctyS+5QIVLgNqEW1\n7eV1rnOu9EIik+I2idGwc7rLcuVSLc2OVKL2/F3dQjX+PJVhPxw3rcr0TqPG\nqbq6idmcIewFJwhk2FDhxIefSRT3Rxh0aK8+UNwW5UX//SNCPiZsR/G+eenW\nw0xDKtgRpO/luq1Wie6iTu6fhfUG1aEaTJ3b/FdqBSlX/ZKd91uYhJzuQo59\nOqlew6gZbRciAvAsM1Vsxuh6lFzHWpu9meUMn0vZV/Zy67+KqWP45oRqlee4\nVHA5PV8cVDJQgTsPNRqjkAch+ZDIB4/eAG0j9TzPvCljbWbfwui+m3gSTCAR\nqEwSILzifaNoAVtPIJLVTAipP0eX77R8GML7oBN5RTtk3E2/BZb3Ej+682Yd\nZJSsG8bbb9nfSdGbIDWeZR3j9BEzd8NR75wQlmHcCV39Q9BwZKAH9xohhxPf\ngM0jmsarbMhlxk5QCf7M8aEzKbplNz2z2W47NiJZFEDFWY5aoICYN4uGaOqa\nGcWhmAFTatRLAbRwbDE9BsrsMOwEgu4N2mvS6PHfPbiO0Znlk/L5kzo5+L+2\nwtVTETtYx3tL+fMvjrnEAosOIkd4IvKCatqotErIj5F1N22KVyn1zd2mtclG\nO8IvCriGNUOm100PsRFvtHWzrgrVNfJOiBlSN4RbxqWGlgQzAEdYDI38SY2B\n72/9\r\n=S6iM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRjx0LhQQtqudroEQlN9Q6faMOz2JGxY/ctqbTt+StCwIhAOjxAVZ1LNBYQCEIXGfGICCOcxOpFoBx5YOPoLis7AU4"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180808084410_1533718124406_0.47323351790255574"},"_hasShrinkwrap":false},"0.5.1-20180809024527":{"name":"@atomist/sample-sdm","version":"0.5.1-20180809024527","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"https://r.atomist.com/2271969078","@atomist/sdm-local":"^0.1.3-20180806075910","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/188497071","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6fe405b144a0dfcdfdfcd151c555137d1be3832f","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180809024527","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-PleT+st1Mw9vSkUXcr5NbWb33epR4tz/XMi2Jy1+ug++OeJM1UKicai/P/DAt7xIXyA7cAK0NjbHZOAJWftm/A==","shasum":"4b64282739e9f9af12a85deedde8e9b9f0722fd5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180809024527.tgz","fileCount":189,"unpackedSize":639336,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJba6v+CRA9TVsSAnZWagAAyXYP/1Jad6FhitnGGKngd7Ev\nXYILQfoNGpLMumfXMCb1b+6fme2DFzFn6lBMpd+3OVJyw19EYCzqKqNUMilI\ndsCCkdrXe0gzS7u5Y8ZBfORKAuC1ZGhbfrJJ3hUpBbbYDMS4euF5cRaQGQEF\n8LMZ/rDeC7Y1VhM2/Wrzks4w8IEKj0/BrjZe5WBLtKF3Vhj2e/C625dswuqX\n7c+tKlDDcWy0JxrezaMQDnMGos6pmYOU7OYPnVDee3AireUBx3ANB7o8zxd7\nxo+VpzYedG4Pkt9n7VO97X6z0A3UNA6RHrBtqg/M/NlGonjGmgEoiNwxhQff\nDGALaCptSHY19LZGTABSK0r3Px9gzhDawy4+exOA8td1y1WD7ZzScNRwvpd+\nuN/JER3j2o4om02mNkRDWFeLTqUa0uwt12gpiYepuioccLXvt62DmlMJUypC\nCv1mZOOjriNuYZbOXI7Nt53lQAAuggmiBDFCeCDasKX9mFs1jXJmk2AhjaX9\nOErgk8tX8Z6Iio+ZQjsyUzPSiC288tHNkQoNDQdJ1poojGL+Ce3McK/oY+hC\n6OVPPj/rUeLdeYQ2gIyCkQRJC95VRFU5ZxA7jdTFEiyVaV0HrDw3YKV7FHVP\noFtJ5TsjARhb9ns1W8SvGtGBgD9hFYBNkmxeJ019kPqYfSDAHxCAsg+B0WXU\nMwe+\r\n=bSgU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDP/my4odAcpQNEB4nvF+E+tbEyhmJmPUSviFh1ZS4nzgIhAO42/cgyzQbXwyFyYBAgUKb5BI0a1QGsvmkrfUvFbyjA"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180809024527_1533783038046_0.9029334333136918"},"_hasShrinkwrap":false},"0.5.1-20180809175220":{"name":"@atomist/sample-sdm","version":"0.5.1-20180809175220","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.0-20180803232455","@atomist/sdm-core":"https://r.atomist.com/2271969078","@atomist/sdm-local":"^0.1.3-20180806075910","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/188497071","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3fb8bafb37d41683c224f96f633cca2d76625d2d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180809175220","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-3mgd7abjD+wELf7bl3TFxkqApjEFeyMAglTQ4xHXVU44JI/ZoXZmvRKVDrCgbfRntO6KhuGtOm/PYN7grGSkRw==","shasum":"e7726d27038939f3b8e4876c09b26724027f0cbd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180809175220.tgz","fileCount":189,"unpackedSize":639336,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbICdCRA9TVsSAnZWagAAMacP/R26hf3iIrHyKSYWq+7n\nDnIo7LQkhQ3jzWL8aik/xkvjkbVXtaySpkUWBNtKFuyXnF9tF0JhB9bhT/HB\naFywHmbGghnTFPsWjc+6p4Vkx7NuiMtdBAmQt4L081p0cZN1v1XcNKFmE7wo\nySiy6nqFYx917nQHEsbK5M8qNR6aO0h5dITfkhWMK1Sh8Zxb6uYFr5a1hcdl\ndv0Y2E2XHavdynRytCxtCwYx3BRW54feL4bU55dIG4GZl2eIkVeBFnb13awV\nISufWJlMknP2siQqowyXvE2J7fl/zBj9Cvp0b2EVB6RHeE6Vs9gdmOnaWQLp\nYTl0B2nAjdejNo3fkE3p8r7YXo3xF1mcX61ICbnnYX2fJe2BAVH/ORvwAZtY\nl66P3IA9Hkn7hjeCdX9bnsHY0ww4/le+9YTJj1jA9ZSqyLxVmFpJSnN8RIqD\nb8Y/2mjkKlzPpG92/lzW5+/Jxqs1W6Z8EXtJbVIbnYAit8S0OaXWTK50xxsf\nnVWaGLo+33YTYjbUazljoxmHVDQ0A9VfD7QD4WpmRzc+ONX1Pyjb5GoLMpgr\ng7RfF8yj59yA0Z5ko4nK/OxH92NFofgGu3KLrwR3ZrTRUwq8LL4/9aWV68cB\nRBiGeeqjmSVyrVYxFbMyCheF4eixdWraPWFzhaEvFTQ99T/+nnLWnhTV5yAM\nLIX+\r\n=2M+F\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDy6D/vA74ar+jd959TvOqy4YX2CvT54qHEXsdv1kknsAiEA1DnIzhszM8E26RSzFhfCj0eBWJlJVrKKEto1sFse2uM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180809175220_1533837468886_0.6647320954950542"},"_hasShrinkwrap":false},"0.5.1-20180809200530":{"name":"@atomist/sample-sdm","version":"0.5.1-20180809200530","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.2-20180809172928","@atomist/sdm-core":"^0.4.2-20180809180111","@atomist/sdm-local":"^0.1.6-20180809163830","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/188497071","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9139d974b9dfd2e014ccbb0e908e71acdefded66","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180809200530","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-MenkkV7dCvijnRtZBzQkzT1+8/h/CWEOx+5TycN8XFhiPpjYBoe1Zz+Gk7zPBa6c9Zj81B51EQlOxbaWB8G5Qg==","shasum":"c5917f3ecf0af15ec701a61c89c38c81b6aedf28","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180809200530.tgz","fileCount":189,"unpackedSize":640216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbJ+KCRA9TVsSAnZWagAAWrgQAIvveDoORne3cUvd4xJM\nmXaWzMon5pBeinVnSZ7Ke9LW6bYWL8Zgn8j0LRUAtGtpKl2/VAiAdhZTFW7v\nll7YHW56FmOckiNTyDWFPlQshS7j6mgHmpAv0ilphQyUhHMTGCMcLdW93bNq\nJINLfNj2zH188CzmXn5wr0Lc0JJe1qJzGFzmdeVocNG55PMVrR5XN4AgiTsk\nUMxmd9+SY2ZOpydBKRiXOVjHWT/30GVVCl9c1IX5dkLb6Q3+v4uyJTwd22wI\njfbwcfDWNa1M4mHS0YdvyKHLPTUSAxAkmf1keWQkEruYzUvm5bJ5MeWlVl75\n8f8f01XT6u8EA/ehO/11WENntgm70PVjdChTfv+6b5DzBIPIeeAkJGiUcyWt\nVnaqngmJ7VwK7nteS/tzb3iP6oHumBOQK2qxVXOyBw54ju4J4S1F/2tI7C5i\nhbmJ9uPr+NhpUQJioe0UmeDHFgrcte0SDcufU+NGkTAy22Z6hezTYfxNzZDK\n/1xZXVnZtya9nnBGTwUR2KUEAwsXekXMtLWrwc1tIOV+OxDX7+9eNHCZzI2a\nYccoMGYcUSpqSxDVOfqOO9toJh/aObbTDovXhWqOGFi2N1b3Rw+wEFgLk5dO\n4QcTjhO89uevv++Tlwv/fjKJuJmdBT5vHW0Ocl4JvLuQCF5FwBPDb0SAnzLj\nQik9\r\n=t/MT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVsrzwlcqYDuFxpsMoRD6VxiNlSep3/RjLir0zqlkdqAIhAJlNIKNa4vVMmURLf7zwwLuz7qAMZr2wOYURjYaJ9E8L"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180809200530_1533845385050_0.2452426247901287"},"_hasShrinkwrap":false},"0.5.1-20180809235506":{"name":"@atomist/sample-sdm","version":"0.5.1-20180809235506","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.2-20180809172928","@atomist/sdm-core":"^0.4.2-20180809180111","@atomist/sdm-local":"^0.1.6-20180809163830","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"^0.1.10-diag.20180809232649","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"726f9b4953e12d67d0f4a072f80213df311150ea","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180809235506","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-TjvIioYLyoqBotoiyv8NXLB3tmHKT3nTgNJzalLJ7XEhp+5Bn1rUopJUiuKwYXqeW9w56U1BeoBMDv6lJ0RTOA==","shasum":"6e7449f9be914312265f39dcbac539a2604dbe69","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180809235506.tgz","fileCount":189,"unpackedSize":640433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbNXACRA9TVsSAnZWagAA+mkP/0lrCWJcOTqSUEWagnXb\nOABvdlLiG/NWr/6gD/4nY6jVAd9T9QfK83du209POKhVEMSTNvLjxiig8Fur\n9ppc91B4MPfCWIid/yaCkidQp8v7ov+6rsVJgylb/qVJepdthsqQIA5gbAvy\nvrDNkdf+f9saEK/cHY2rZquBDh8YLSzc/HcO+IJSLm4b3Alkps7riu02rjTf\nW6NgHqxcPn1d63lm5uf7o1vFyYq4PQX7kXli3646qLNqudDdagxcdt2ezDYV\n/evea/cNWyf3pzWU9WS8toPGdio4cVjTXXAe7BewcZhkHYNo2xQ49KCtrdQ6\nz/p+kw8ZgR9sw1flCO5pQcj4mDTWwZcelgg+Q4lvdBTy1rgsC5l8cdfIuNG8\n1oq1hGIxyhvLNfg9HyQMSPweAZplynptdagLz7VBO5m/ZP9PVVwHRK5DpzLo\nhmtqZLgnuh2XXCJZpcf3fgqnWyYJMjAoijgO5CgTWbYCjLXHWQqxGTSOOEMa\nN7QM82A5y7AAWJhGCt8o0mpMHDewR0rY13tmkWVmeja9r1Asq/yQvYbyAODj\nEN/SQlWEyQ70sl15iEZ82t97RJ1PMlW75YXY9ya6y3KwQS9/0l9J1+0tk5+o\n9neSJIDrikR7OY00dQX6BlGTaq449255GzLSFtpppMAzfaYajbYnAtqijsr7\nxksi\r\n=9XWv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB84XMuL4EV+iPt1ayZb52Nf/Hh6oNmuaeNh2THf517QAiEA3dz68UKlVVljr+o22SdbgrIcI1DHVwp83h8Qy1LNQhc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180809235506_1533859264086_0.5604605979623731"},"_hasShrinkwrap":false},"0.5.1-20180810014340":{"name":"@atomist/sample-sdm","version":"0.5.1-20180810014340","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.19.5-20180803222129","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.2-20180809172928","@atomist/sdm-core":"^0.4.2-20180809180111","@atomist/sdm-local":"^0.1.7-20180809232346","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2116620606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"44e48f915345c8d55291497eeeafea8579a26908","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180810014340","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-/IlUiyK3Y4DL/34xMw5JVKduOkaa+4r8cwKV6A+OnhBLdFJ0hmwStlYoprmIduAFb7SfcASwFW3xtF/Puo5/Bw==","shasum":"7f0e4b12fc2aa0ee57c4d3f69a5ab306add3b538","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180810014340.tgz","fileCount":189,"unpackedSize":640606,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbO60CRA9TVsSAnZWagAAI8sP/1FU7Thcr3FYdLlZgC1o\n+wYz1JYZWYxgX46qcYJLhpfV168kB71ixsBoPZ6VLuyWDqVPvcnCpXOeMgjZ\nWeNixTHXp9woiXrb21vjZ7Ns0FVSOuhXqQVhtMcZ4sPR11CYTMCfIFfsjHEP\niNCuCflwWAhJP+4r59gqcv7C5/pm4WSukiVSYtltYg5YI5mKjr/hB0K/vx75\nQkSI9ORSSEzMfbCG8rdjjhGnAClFe3y7T+nQ5fmEBOUZDJ8OZsDYuHa56igy\noc6WRiJRO5hq5peGL0lLiW+miTRB3s0tLgwbuGNzUr9IS/gml2L0KhbQRmje\nVr60H/T9rTvPKt299gaquHTVFThEVSJJT8y3XGBWgG7PF5IITD+UkVcMO9t4\ns/+YuUBi51HogufLTWjXzW5BN0cmhvVETZpWg0ZII0M762tCOu9julpCK1mr\nAGdQBtaHVWWuiohBvnOwM3ntbdtTj8GQE5VVX3YGinVK4rFL92kofBtR/xIf\nyg0gTLv754qp5v6UUlhtCgytq3BjxJ4zb+vT7Oz/WJRTDkZ10QEzU5NJSxKt\nfcBqP5Ap0BeZkfBWs0Vyo+TyhrxUg+pD+/wApC3zCiH9LEYis0KdoZTUUOTT\ncd54W0UTZ5y9wl8alcW7Ynlr4tg7sLVS/5akINxq4Ag4NFqU2+pnaEow+AC9\nlGmx\r\n=y/8t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAgtxeONUvCsw0lkPvPu8dToWXkTNxTChcaoqPyJ3KGPAiEA85P/dIydIBUhqBYCu9mQFNJYJQOMRxQ8V4F+IMtaHQw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180810014340_1533865652615_0.8526635735565113"},"_hasShrinkwrap":false},"0.5.1-20180810094403":{"name":"@atomist/sample-sdm","version":"0.5.1-20180810094403","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"0.20.1-20180810085422","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/sdm":"^0.4.2-20180809172928","@atomist/sdm-core":"^0.4.2-20180809180111","@atomist/sdm-local":"0.1.7-20180810092206","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"https://r.atomist.com/2853137397","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2116620606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b9497b11e0649fc8994d1c69a6a2a046e8cc703c","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180810094403","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-70qk702qFLY34SRIcODgIShzFMwt52bgTtUCSbQNZ+TW/lcwUyyJ4k6mRIeOQ7BN5gnvjYw3smvO0FUyfKzSRg==","shasum":"da169639f836f7721fb4c3a9248aacbbc3d14a00","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180810094403.tgz","fileCount":189,"unpackedSize":640604,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbV9VCRA9TVsSAnZWagAAX24QAJ0/AM1sD5YOo6I3tj+e\noj0Mm3hEfCOI/SwA61ddqYi7QAPA3tQtTHwspac5WklWxJVKaRWgku/mIPZ8\nO3VKKqZKAwsbfgvrbPFkhsMoHzE5EtxiU6o4FVsJlsfIz62a6q9JYPdImMs6\nBhn4A7UQnFLnmu42JQ5xzTC/R9wve1+0RgwTY/+BeHAdLgXthB8JyTh3rlMh\ngn8OaVbdkZcntKnAbsd6W2c34jy/YUL5eGrfTKVOuDLpU3k/t4NFO56lskIg\nbeyXx9F2XJfOzZtXRK4kAEAnlcbIbYWe8sTKP6gzHrFfwrJWF6knvnRzaaap\noIUISugXUWq+iPv5cs7/2sbVxcHOdM4/i2cYGJHRU5DMw5wAhAU/t3t0ZwCg\nRmL9/zDh8QtCOhdUzcEScUOxYySYFx0KagKAxP6filoaTg5lQJULGxhkyzZL\nrOKcnDlFsJIOm7Yi91CZh0yrUEy31Zy3cObvYB07oevSAzUb2vRHZ/Te2nb0\nCQIlbFW+OtJlRvrIc66QgsfFUvZO8D56gs1UWGk4plMWKy4319T+fY0/g6zh\nETcAoUC/fxuqsglfFAdfrBoGWzjOKv8RByK+N8fTfkGXf0StE1GDZ7I62fbV\nZ8OhkXROTJbLvAJ7zH3xJ8FqBnhsSySIMwdnhY/Au3MNlaEgg3wuQzmTPEVk\nDsp1\r\n=S7rs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4oifB9tT+dhrOKCBEqIk6fS4fe5kOVaCohPGfVGAI6wIhAIzCAOcFbpt4h6ByLpqHS/i6M/UNd5CCyDVdI1xI27Fc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180810094403_1533894485579_0.7454870913659928"},"_hasShrinkwrap":false},"0.5.1-20180814011124":{"name":"@atomist/sample-sdm","version":"0.5.1-20180814011124","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"https://r.atomist.com/3253322321","@atomist/sdm-core":"^0.4.2-20180809202807","@atomist/sdm-local":"^0.1.7-20180811180736","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2116620606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"0a409cf0a7c678e70bc407a5f71f28fbcb2d80aa","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180814011124","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-edPXaQkx08qunWi54y0g4pJeXj4/RdV3YmmJkByzTUNC5ycUqvfmh6CdEscSIo78kPct6fNgBzk4I7cURc+VVg==","shasum":"7746b027ced8075633df46327f23a5cf852952b5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180814011124.tgz","fileCount":186,"unpackedSize":640295,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbci2ECRA9TVsSAnZWagAAK5QP/jqydQjKxH8H/gzEcCDZ\nHNjBCzK48cpF852kumgQSG1pzwUfUue+OR72I975q/QchwgKFh8xUJuvsQUM\nrxOAAwh86bJVvWnXoJvzYUB6PL6GDmkVgkWqA85RzRE03ietxqkv+UTUh4Xe\neA7Kw0blbLv3lN51sqAs+1js1s/Su3EE+ZQmO5IBsONylhT5s9rRn5XjW7Ni\nWybkwSuXOKjXnuWFeAV5W6SXzGJrfqSDh0h9VgP4/JJU6IDAQxIC2DT3N/ke\n0ncu3AOAPeWrnWmJDl9gVHK86xjTZulm1k6M+ePgYwagkYFjvLFFs+aj6MYe\nAudYvhM7nImjMes6A6S7N6R/r0hwQgrsMzNxuz2Y2cZTKkE3SSo9wtqNan/U\nY0ZVygjZuZacvFyXDfDSVpJnYbLn6DA+HJZqY1rdpb7WYDxdfMaL0kMazkcu\nv1NgwZyEN0pwzLTsumb61S0Gt7B6iJcfo+hJggCeG8QRej9OxHc241ZkLVgD\niGJROvXGGktCKnlCkplKyDpP0hlxDQ/UZzKvlA8HexXkInklF1mEshZEZ1D+\nuF0OzSu1DCMnnk4KA2/o2dkJOyGjZPizwQOxS0qVbTX4zwbPDI4BGKvwX8Pw\n/3ebQ6rBAnsFS1tkyqbaIPlEZuJMevhL6ZoPCuZqwHE46nR33DhvCvNUBB1K\n9KEt\r\n=A8nE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGC4SmYdEHBuLkVDRSvDKXJqWqbonpCLUL6ObDvVMoWgIhAMIEKo7bQ9KcVArhZcJVgCa/NV+K51E1d4h4Dr2J52Rq"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180814011124_1534209412576_0.45540957843145846"},"_hasShrinkwrap":false},"0.5.1-useCloudFoundryPack.20180816032939":{"name":"@atomist/sample-sdm","version":"0.5.1-useCloudFoundryPack.20180816032939","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"https://r.atomist.com/3253322321","@atomist/sdm-core":"0.4.2-removeCloudFoundryPack.20180815183946","@atomist/sdm-local":"^0.1.7-20180811180736","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-cloudfoundry":"^0.1.0-20180815192009","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2116620606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e2859f4cb0ac53bf078d637208776dcf907e9204","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-useCloudFoundryPack.20180816032939","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Cm+BBYd9BIoajc7AEVl1NYB0D97J0jboxqNnVbDvK4OyjQHZCQ31a0ng+lj6CRw1z00FWquKUIKJ9MEwaWCb9Q==","shasum":"b9950bca16f19857b242abb13e35b295123092c6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-useCloudFoundryPack.20180816032939.tgz","fileCount":174,"unpackedSize":621152,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdPDNCRA9TVsSAnZWagAAeigP/0Vn2D3a3JK7FHjv91yx\n5U/35c3sWi56T+5r69+eaPHmiLdj9u9tJCsByk4KfIrgYAvN93jAPHoeI99l\nSSnNaPFz9qYiajWia0Ibx0ni7baghylgTLbcktIoq4Fs+kDexXPHfZzVQRu9\nWYxnQRMEmyU230yo38FaMkbk9FjTd5PUr6H1wdMzYnqFNK6+f/pCI7Wh0WAR\ns1U3noMrmHce5W1DK2rS53oo2C8rErwWnnlpyekLb+bbSxwVAElP9nzVdwSX\nEW2GQjRGdfCcPoUpiTJ7RIyWrdoNIBjW6nzGyqRsJz1F0EvGBQ1xxoSJBEq8\nJLgEH3VqPoSJLu8bxgJKj9B9SZ/ctPS3w7qD6+qxl/JlvxtFIXIQeze7Yjh3\nLg+b1ldJDHZBsFJmZJuvD69lilz0DJ2M3Z91z1D7R+VC9gbc2nHeBVjq6lQM\ny+XKNC/b3JShVSymzFCeuhErESkw8nHxHMLm/ITnj2Wbu0hTQwh6LVHs6E4m\nBZvTh0ostoypBIwURWtJnIZm+Ei31ZVtlsz4AsxB3dvv7i8sgIDLLUO1cHAV\nzRJYqDZ57YJNUYZZOmdXRkkj7Rx8l3d9G4gEdGiAL2RYJRv2OXsg5RfjP/dl\nHorgl7g/7meGfRmChAGOB+JXc5oFLV9jVjMNwHxtMU7qT7w9OtjWjAY/kXv6\n21tf\r\n=t1Z7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEEOxblxd4wAWCvGBg5YwTnUyxfbp4vPF7UvdMAbKTKCAiAzbTYxIQa8yLn9tspFia5SyPoYDCVz9s1Lh6bMHGyoug=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-useCloudFoundryPack.20180816032939_1534390476810_0.8047760520013514"},"_hasShrinkwrap":false},"0.5.1-useCloudFoundryPack.20180816222925":{"name":"@atomist/sample-sdm","version":"0.5.1-useCloudFoundryPack.20180816222925","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"https://r.atomist.com/3253322321","@atomist/sdm-core":"0.4.2-removeCloudFoundryPack.20180815183946","@atomist/sdm-local":"^0.1.7-20180811180736","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-cloudfoundry":"^0.1.0-20180815192009","@atomist/sdm-pack-node":"^0.2.1","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2116620606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f131b7ffbc691cf5cf4bd387c2bac3bf5af32e82","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-useCloudFoundryPack.20180816222925","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Ls57L2hWoryzzBYUfJ2ZAE3oZr1s+j5z9MvwwO4c08qgMoCX0aNhrHWagg3H4xb0kd3ds3iAa9PYuo93SY9DbQ==","shasum":"00200c434baec5f5cb2bca026081a3b3978185bd","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-useCloudFoundryPack.20180816222925.tgz","fileCount":174,"unpackedSize":621523,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdfv5CRA9TVsSAnZWagAAgQ8P/RGgWpHj12Jlasu11Fyj\n2V4dFuBxpvC5JoLO6ZnvPLNjula9r5UBmO1dOkOmACYgK1MHJNzYtQPJVDDt\nCS7OXCAnByjnOx0DRfO0/Wo73omT02SUOeTUAAePhoEezx4jamJKTswIxSd1\nsLhZsq2ZAXaN1CJOU8MU01n68+MIi4Ck39QobSE0OlA6aP70PVTPIym78XiY\nO8Xzz+ds7/tyqutS63IdSWqkzrv5nKkZthwZvSVlfkx0sUIRYdMYyKEx9tXg\nIpq6tkY2lUwiuvryz11AdRamCGFyRCW//k8zZkcEHQmVwazFuSIui4qEGayY\nImp8BHcCcescj80YtJLwqUpGBNKW1PBIBd5YUSQ05PboOFueN/8IuD8b8sGJ\nkVCSHIyhK+kltC486nlIXhhOYTsI3gBAdXNvhYkJWsjqMbDS4zevvkgpsLvm\ngCzuFVY9bqvIv1Ajmf79YxMyRtW1lqqXtOsb1FK+Io7sRhDzB7XqOBhTFqkR\ncsmlPwMxgDWtTD2gXogWqhsO2QxsBvn5M5Wx1ACcmqMlVF834UKk9b6xQzUr\n2bVvpbUnXoqEJEnd6G8vj8x0U0EfYcw3eJZ4PGENFUB3jwi7ygxTnWJQ4JJh\nnwFJ0vcc7pe7OU7yuCchcftpE37PlpFWOdhUv6BsNkhykvNLBrA3waJOjTxE\n8+6H\r\n=q71Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCi8l9e/WqXZJtmJgzcuWj24OeffE4Qjcy6/HJ4B7bjCAIgIA+K9SmTobEDt/1QoMfyNVUVSgjLgc+J876HNBZ4P/8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-useCloudFoundryPack.20180816222925_1534458872754_0.39105204077356936"},"_hasShrinkwrap":false},"0.5.1-useCloudFoundryPack.20180817020839":{"name":"@atomist/sample-sdm","version":"0.5.1-useCloudFoundryPack.20180817020839","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"https://r.atomist.com/3253322321","@atomist/sdm-core":"^0.4.2-20180817001202","@atomist/sdm-local":"^0.1.7-20180811180736","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-cloudfoundry":"^0.1.0-20180815192009","@atomist/sdm-pack-node":"^0.2.1","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/2116620606","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"bcced021c027526dee31bee1e09a4f40567b3b8b","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-useCloudFoundryPack.20180817020839","_npmVersion":"6.3.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-+cw5BUlYeoFG24DijMT4fkCs+HiwM/8MSilrEXAb8kHBi/JreBHZVLIAGNAOs7HSwTLBBLizVKvU/UYYMoJfvg==","shasum":"a594062ba3b43148c9e5074eab77670c354c8e44","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-useCloudFoundryPack.20180817020839.tgz","fileCount":174,"unpackedSize":621501,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdi8kCRA9TVsSAnZWagAAdbQP/2suLQ91xDz+KUyYkXZz\nZPd/F7xi6nhTM4xcM7L3hTr7q30+s80IKTip/Y5APo9NmOfgrWQRGJnsY+DO\nxcDMDu6NO5D4YYZm3NSdPrlocFF8vVDxLhLdk3sKBFLn5i9gEbS2x7eSuRX/\nBM7QPL0UiLKe7zabRQG+6WStB8FUrajuxFOIHfN5rlK5rVBcsvMOTaa2f6mB\nAVNoAUeqKHEp2DSYICUS714W3ClmsZ1Ven6Z6IZ2YFHtAWHOpmdlHbxERce1\n6LWruT5oocwbyFCYnxj8plObLebPzThLNziMZXtw4gfU13xBEjqfp+XwCFTv\nK9+qe0NVAKAbvECEb0MnvYB/+ZmbbKBMNODBmA6uoLwM3Oxn0zRTghnGsfsP\nJLmAA43PMXIDiYYnliqS3yzYa6CE8CNPmd+BUM8ol76zvr1R/Qg/afzP1P1J\nhbI4BqzQ24vdDRXF53F0vrvNpg0wpcr7ySjgQ+3GnEn/KgwwBT92TcFcYw1V\nxyo36ljQui/d6SeS94dPhF8sr3uAg9p+n3VFKzv5PJfi+EyEid+ARic6NXGi\n73Vw0/pEbhcypH8tVKi8qnZgdk8IR64geUIn9Tnb97LkQnH/Ee8sjprJ6qhZ\nNaqlRNZV2AjM4DwnYwIE/05EQkVJCnKuKrJP+sEkBsjCrPB8muX5RpyArvBk\nasWw\r\n=kfh+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFitDrYGg9BA4A3lfMqXeKYnKz0y5JSjRVLWHQTPwRsOAiAnr8WTHUeQgbKKNAJ72c9ld57blXwwWX+9YEOtWXFYBw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-useCloudFoundryPack.20180817020839_1534471972065_0.26590286532574936"},"_hasShrinkwrap":false},"0.5.1-new-boot.20180826070531":{"name":"@atomist/sample-sdm","version":"0.5.1-new-boot.20180826070531","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^0.4.8-20180824093654","@atomist/sdm-core":"^0.4.10-20180824060140","@atomist/sdm-local":"^0.1.21-20180825205410","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-cloudfoundry":"0.1.0-20180824135114","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/776423766","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"db6b459c90a90171c1babc8eb5314e7d1bc0e351","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-new-boot.20180826070531","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-FLyyAygLBXRIcgEoA03BX2yjPBc5C9N++PG/Us9UhAfVhsyLFDMUeD96wXuaGHGLEt2BOotYRZEIzIBDYvPGrw==","shasum":"f83d67d29c8bc603bdb51fd9fa66bcf7d3f2bd47","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-new-boot.20180826070531.tgz","fileCount":183,"unpackedSize":628580,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbglIvCRA9TVsSAnZWagAA7AwQAII3gVZDVhOKhaEVrbAX\n+h8FBjNQsoy/sB89BEeHGEkhQWz0XJhGqWL1EmdP1a8viyIoO5AzVE+b2/tN\nlWopFdfi8MYMnJ4MPnnQXleCP8H9Q4nhX8zcA20KOHjmw9AmjUHmtuBwddVE\n78aZDA7DJ5bC6xzIVOD/OfPCtUkG+HylWGas550V7nMmKolGznDb58TIi2Xq\nTz1VhCOsG96ra9Aedf2u/YPZGS/DgkGJY+TsBiJDG9fyY4c6O9slGthTatkc\nB6QMqibOMRj+AXEJ+2Oh4PZdlVl6ZzzorNhjUAVeesU2umGcLVcCOxwTcJ/2\ngF2daD5ALZ2dQ95DWphsT8jIS+qoWtewF654wqQX9YB7i8S1TKRbIFN07f05\njckkdk1L+jZNyt7yEA4yvhB+FPgI2P5jW1mV7+oaL5DEs0gr9NT9sM/vLgbY\npIGGRVp7A+Ymldh87m2EgntFIu4qyy2x3gkLHSmAGznlDyCoYNZMC5G7PePK\nOpsHhYdb9MYlslJx8AxC3jVVsgACCNslRqbtfLUIBGsLHYN9VTKSgEsFuIjM\nH6DWOapm8l9Su3qlRVg0aED+kyV9+/KOuEvhcRC5faRrnu2bEf4QMXBJF4Ky\ngPKG8oMx0B2sDrICIJbihyQ5iVG4DbIAu8rXeBItxNORStSS+D2pNvHtTksS\n/hJK\r\n=1wyg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDQfA4j8Smwl/lY13BuiI8eKccDWQrNi1FB3Nhe1aUadAiEAnSjBFoIpU9wF5v+mNKmv/vAqLe3BY0mcvpf5gzfR6kA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-new-boot.20180826070531_1535267374976_0.5810976482220591"},"_hasShrinkwrap":false},"0.5.1-new-boot.20180826234519":{"name":"@atomist/sample-sdm","version":"0.5.1-new-boot.20180826234519","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"https://r.atomist.com/2543416479","@atomist/sdm-core":"^0.4.10-20180824060140","@atomist/sdm-local":"^0.1.21-20180825205410","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-cloudfoundry":"0.1.0-20180824135114","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/776423766","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e63aab45649188afbfc95e2c3402b24a8553970d","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-new-boot.20180826234519","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZKKfWteyfrOokL8kIie+dICGaKj2Nkj/NhH+/NlccWfmsq7MQ2XsjbOxo69Yr8srMV56M1KqMBNwpDKN7mTL/g==","shasum":"5ed7df43f959312941ebb8abb4b3dc44c75fea03","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-new-boot.20180826234519.tgz","fileCount":183,"unpackedSize":628591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbgzyjCRA9TVsSAnZWagAAUrwQAIhF+zoaiNs4agDIU4IS\nDflmIyJTNYv2uSX4W7MhrmM2ix/ncKNfn5avJGwtSVUVa07+YelYDYVGl5ab\nakr9C+Y71by4Yr8tBrK1LqR13l2Z7hElEeyaG1G8cD+cEgBgbUoZeHNqHhyE\n5SLv16s2vDSopfguBd4oCW6dR4yLhyKtCwf3Yrr7J408y8XRG1rULlPimwLN\nTRX80yz+YRN1M2S2Yx05BwC6Kg3GZIQKdRg0fvRJU3Xph7atRLdMgmn/5HrD\nKBtCwV7LPov1Cmg450om3jPEH4MTp/1XfDdz26OZ80nSWVfoyUv/EvF72XUC\nf90TdQt7pRG/HRa7ox0l7Qeie1GoTTJDTN9Pk02yj39vNkDGeLL0ezepi5Eb\nwFoP4kxSJrCJkL1dhf4y9DnnK1mrA0+DTybB3XmsgnYG+2ySfb9ylgCqQJKp\nfQTBwoMf8q0WJ6yFUd8n3oT5d3cdKz6BpL2QBILxxiyCnXhLi3ajFryf9zy5\nwUng3xPHBMrExSOwG3QtKS8KXWnFzzGQcrGgpTJEyLxy9VUXungFo2CpxopR\nzItO+XTu5B4fJqMZ+eGljgSnCnWY4E5yWFD6pQn107bobmv6vdyCIu2zblyY\nLYnLL0h7EFHwwODJgG+do5eJLvxePUgYhQrQweCiGeppzzsJG6EnXbJgwcjq\nMerq\r\n=ttYO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5wgzAMUNQKkmAr2MJ03YeWlHFZ7E5UnAXjgMeI6vRxAiAFc+hFX9xwd4OCOE6zw1JTW1N4eZZ0/31+8XwXbfxIlw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-new-boot.20180826234519_1535327394807_0.8437538248203951"},"_hasShrinkwrap":false},"0.5.1-20180827053811":{"name":"@atomist/sample-sdm","version":"0.5.1-20180827053811","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^0.20.2-20180810211649","@atomist/automation-client-ext-dashboard":"0.1.0-20180705210657","@atomist/automation-client-ext-eventlog":"0.1.0-20180725112931","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"https://r.atomist.com/2543416479","@atomist/sdm-core":"^0.4.10-20180824060140","@atomist/sdm-local":"^0.1.21-20180825205410","@atomist/sdm-pack-checkstyle":"0.1.2-20180629042836","@atomist/sdm-pack-cloudfoundry":"0.1.0-20180824135114","@atomist/sdm-pack-node":"0.1.0-20180730213105","@atomist/sdm-pack-sloc":"^0.1.6-20180812192203","@atomist/sdm-pack-sonarqube":"0.1.3-20180629030539","@atomist/sdm-pack-spring":"https://r.atomist.com/776423766","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"peerDependencies":{"@atomist/slalom":"*"},"devDependencies":{"@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3","typescript-formatter":"^7.0.1"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"npm-run-all fmt:ts fmt:gql","fmt:ts":"tsfmt --replace","fmt:gql":"prettier --write \"**/*.graphql\"","git:info":"atomist git","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atomist gql-gen --no-install \"src/graphql/**/*.graphql\"","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atomist start --no-install --no-compile","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"9654708a997d1ea1b46ba50ad88b716222344b59","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-20180827053811","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ZdC0kVoCgQe5sUEeV9U+j3BCFOyuhsUgYmfxufE8u6IiM9gjtbnzO8ZC5IeXBjwJHfi6Cbo0KHsssB02+IorzQ==","shasum":"4695d1744fff2e6899ddb8fced0c97b5b2e8d2b2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-20180827053811.tgz","fileCount":183,"unpackedSize":630202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbg49ECRA9TVsSAnZWagAAYOcP/1z43pcHzriazA+wa+as\ng58njCOTzNJGSC5NBFsBhHd+VPZFrgP1fbpEku3XzHdbuPrm5apkiwReHG1T\nadaG79fevMYKcHdDSvcqfe5XT1EEqX3fxFPdHipAG5E3ish9gh/GA+IcsBjy\nOoRV5kLr3yExrKzBDb0xvdofoFsquUiQ9y8KxbivEa8ftSWfMQI3BHd9XLFt\n/PgmuWfRmORDqTehm31rYbhG4UnJH4qV13+CL/f00QWnhbtrWkx0TVSha1A7\nKyHea2SVSMJBKQs4cpLwfbjEk+kBYiLB73NL/eCtoybRz+mu3v1GEP9Jou+u\nichvTQIxkgTVYBGR6B4fiHCJYMQpdFodZD/8nyYwdv6sC3MCtZjYGxhb+7xW\n+pSm5iyj/wSXaugT344ApvE4w0FgL64eYPFXHjVEtDHxjLOzLiKyedB7qrWo\n7y6wELyS50xVqdiOr4pLY7KHAFWshto4sC0qqI6oPk8ngFGjI4mNscljOu8X\nb13wYwSDK/i7j8x1ejQiO2gKjTti+iDLrfCe9yEJETcgKg0Rgaqipsqtiuf4\nGb5Chyq4Dlc6YpiGNmAXIXw7FgVGtJHYlqzZhhwKVD3VJsKnrL6egQc0Vydx\n12dT0auOiWSw1f9PgqnOShFsd779IJEJnT4ZVDUwLLPA7ni79d1pwlGnL1Ln\nbd7p\r\n=UR2K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAaySwyyOOk8j0zG23jHJ8sq529Uq0X7+4rL089tGFiOAiEAmX532tUJpb58CYkEj2fcREv3BnvXm4uk6+wBlYHocfw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-20180827053811_1535348547485_0.9745883868229994"},"_hasShrinkwrap":false},"0.5.1-master.20180828085002":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180828085002","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist, Inc."},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-M.2","@atomist/automation-client-ext-dashboard":"^1.0.0-M.1","@atomist/automation-client-ext-eventlog":"^1.0.0-M.1","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-M.1","@atomist/sdm-core":"^1.0.0-M.1","@atomist/sdm-pack-checkstyle":"^1.0.0-M.1","@atomist/sdm-pack-cloudfoundry":"^1.0.0-M.1","@atomist/sdm-pack-node":"^1.0.0-M.1","@atomist/sdm-pack-sloc":"^1.0.0-M.1","@atomist/sdm-pack-sonarqube":"^1.0.0-M.1","@atomist/sdm-pack-spring":"^1.0.0-M.1","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-M.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"20a46605be1f67c5df7762e49767262358216a2a","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180828085002","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-DZLutKPNtUtNTTj3qmJlFK3YGGIPrvVe9fko9t3LueG+P2YfXPuAmT6ZKggn33glJZbbX59chiqW5RI2+K1Z0Q==","shasum":"a1bad4bb72f08f270ac934c7822aaebf681ec0cc","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180828085002.tgz","fileCount":183,"unpackedSize":618599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhQ3xCRA9TVsSAnZWagAAFGIP/2AstnIzKStPphfLIqfI\nnK1+J7iDbeuQ1ceonrs2qaobASzbjL1OFcty/6wgE2StDO5vRUSyCYi9DMYw\nrvvYXHkXen2nV6s4BLUex/iX4XLHduQrG5zP2KwWFRLYzSW432jAiTCyOHtw\nlmIAmfwQul1f/i5raxN+3Gadm0cVBO1O57YHFnQRByzrdxEhqSbRpCDrsjbj\ndcpWauHdOu3gQQDBNMV5qJe7lki8zmBvDfPB5kaK34ur7AeOhD6qGPmVHwJb\n58mlyj9N82kpU89tM9n8Q1d1MoSYOa3nbea7L9dbEUsX20K6DQ4VwNJjsoRE\nBlw0vYFdrPiUs0iGVbJjO+gVewcOCc/2nA0ceWjUSQAoy9ffHcE9HUFgxsag\ncoYXKZ2k2sVwvIhU74ZwsC0Lxnumq3Q8gaIRm5NZTvlGPF2uarKEzS1smmBy\nDudNX9BUB+Jgj8ZPuew9RNPWyvGGX/tOGFgFb6zGSLKxTNvc6cOURh9Le6x1\nybRVUS9FUVVC7eDp8GD0XvTZVEqlyOWoj+BNjY/X0aHtWwdn1/gUmwfMKNXL\nMoJ+6OUEUHneGUddp6KpZTdybj9a8vTjMvXB+cp4BbVBZJh/fnUpVA0sWo6e\nF9eAS/umgsYEWrDJv3HWQphY4P2/BCqFrjiuYjmKVgkdDbbv11L4ERt85xrx\npqtQ\r\n=i60N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHNYNLlhH9vJVGQ0eyPE8hSJJTl0HR7OqzkuEK7Dw4dgAiEAwi0oUqdyRzANx47OutqoaM+qCzxSUO7mKHAr6VIU5Ag="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180828085002_1535446513155_0.007457583205591867"},"_hasShrinkwrap":false},"0.5.1-master.20180829091039":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180829091039","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-M.2","@atomist/automation-client-ext-dashboard":"^1.0.0-M.1","@atomist/automation-client-ext-eventlog":"^1.0.0-M.1","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-M.1","@atomist/sdm-core":"^1.0.0-M.1","@atomist/sdm-pack-checkstyle":"^1.0.0-M.1","@atomist/sdm-pack-cloudfoundry":"^1.0.0-M.1","@atomist/sdm-pack-node":"^1.0.0-M.1","@atomist/sdm-pack-sloc":"^1.0.0-M.1","@atomist/sdm-pack-sonarqube":"^1.0.0-M.1","@atomist/sdm-pack-spring":"^1.0.0-M.1","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-M.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"63e959c2dc4031498b49676351ad24eadde5ccda","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180829091039","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-HFbrP5WgqOPXiCUlFGQoWPoVe5MvNcp7stjJXZPmMNyG875wmod4jQm6QAdU12cX2/tdelkp+5U+i5w0HSD5eQ==","shasum":"debc1c9ac34cbfe866afadf794b746bba446a725","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180829091039.tgz","fileCount":183,"unpackedSize":618682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhmT4CRA9TVsSAnZWagAAnWQP/3TfO3L2aDy5uq3vbI8M\nDrXS6NLU/i1i+M0c1eKlVxTyrqOvDEtsD8I95UxSsi4O/M1BW4sdtJ8FAiGI\nqsDgebMOCbuNYIk/4D+LbfKtPLUiwe2/2X03LNF9VOiS0QdXf+uTsvEiJewL\nPa77uCJ2ccKgA40vjCiIg+wv95xee9IDXcEgv1J4hD+4ai43Ec0DSo5Ivi/M\nCHAT4RZM6XgWDQrDeYJiwb6aRakHLZo+kODO/cHSD66dTEY1PILdG0h5/zWY\nBvjwMYQYCYzkFDI3mWsG1+BY3Si35x/s7LMdPlsvpolMO483a3p85vrZMM9F\nK0fyFbfQwM0Minmw6w11CWUCLmfYw7Y1AvZRlrC0EqYtOIls+JAH7X6P1DlL\njlnZwoTvwLoCHiHbm37ANRi4hy5WdEwcAqpx232a4lZJ/a6q6A8tfkpF2EAM\nonBZ1GFAXbbNIaLkEPc5gGwALbVWVKZWapB4/t7fmKJTU3muGh551mChEQj5\nhFA97znHhMdiwpimSWjl1/qnNkP6Ho2eJ8ob10q/dzIFr/M/GAUC8aA5PSFm\n6DPNrDeRsAOnIg0G41g+f2b1jl3bWtP8I1JzFc7Sm1kZKINvp2aY/5jog6O2\nHHtgqLxwc3iOOnDNKjlQHU5sWiYpb/vA4hZGrhQfOQOHAIva2qI+RZO914DD\nesHV\r\n=aUL0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEapK3ttZA5+0fBwo2vCz35sKeznKhWCnLy7IkLvffjyAiEA2ewpZRLfYUsEcjl8ZvwqHOd52l8Ka6V4Zvk40mQ6Bn8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180829091039_1535534327885_0.28175282467613516"},"_hasShrinkwrap":false},"0.5.1-master.20180829152133":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180829152133","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-M.2","@atomist/automation-client-ext-dashboard":"^1.0.0-M.1","@atomist/automation-client-ext-eventlog":"^1.0.0-M.1","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-M.1","@atomist/sdm-core":"^1.0.0-M.1","@atomist/sdm-pack-checkstyle":"^1.0.0-M.1","@atomist/sdm-pack-cloudfoundry":"^1.0.0-M.1","@atomist/sdm-pack-node":"^1.0.0-M.1","@atomist/sdm-pack-sloc":"^1.0.0-M.1","@atomist/sdm-pack-sonarqube":"^1.0.0-M.1","@atomist/sdm-pack-spring":"^1.0.0-M.1","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-M.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"b74abd7e1cfd76fa7b2393fa8ea9872d02a8e896","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180829152133","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-zfzyVk+BR7OD2JQgk9awdf4ctQCWKLFcYuc+0+yP3ySihWjacCyqNVjksQg6G20TY8U8fnRYGOkTVnEFIVf4Ow==","shasum":"fbbd79b9d4496aa237dfbbb95615a827c399094b","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180829152133.tgz","fileCount":183,"unpackedSize":618682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhrsgCRA9TVsSAnZWagAATZwP+QHKQ2OP9TIzYOce/COe\nfJJMEqi6BCovPInSMOrC29NpON/4b+JdMnijO2kjfP2aVjKiwGwM/akMcLKK\n5y9peOmxkCShDHkVrUMWEIrZk9q0q5hO4BqE6Mur7xeFgncBbZEsydiVrFs7\nlUJXpwk6P621oriyK6s2Vk+xF1jDMiNb4EPuggdBbLvqW/dnbfkqjD0MFJQd\nfFN+2FBsq0wyzOIYKaUTaHLhbuiPPkpVy2yPRPXUGrRHOPwW8FXyo8WOAC3B\nynWXAdVP7NmH7YcRrVIJvgMiwmeXiq8OmYAsGm0fLXse0H0Z3kca31r1hliJ\n1k/ssEbSPP9ZuK609HwrQ9YvGIoKRfLnICe735nqXxIXy0gC9BBBPobGi7It\nJHXv0YBMlLFlZWuIlrFtPclVhXcAHM3stYHg2uXJRD9dd2EIpfXJiQil4fIG\n2qoWBJ90qV8fglm0p/vzzjnDHzTAqWOJ4AYAXskn6gZThNykmFzwE+fDLgsq\n2k8mFCuBmqVCgox3GHf0BDHPn4ZSkvSxyxFRdp63yWk2XCvEkabC6fQ1AvZn\n3WAfakjRNUZWms7hUzSerpiIBXVKQ99aHNqvE6y23B35Q6m+m+kgxzXWiMjL\na2RMYZ2mf/PsjuvN1zH9PI6Pxro9FO8LiD8dzLEOMRlBGdzTiSG7RNoAEvPJ\nIsMg\r\n=5C8X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG8UIlWqFhNvLd0GJjgY6UKIY6NhP+Vi1OKrP9Tsf36CAiBwgaXogSE7uHt/5jUmK24suW0uNe88LCsesIyIP684wg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180829152133_1535556383328_0.2054171457764129"},"_hasShrinkwrap":false},"0.5.1-noise.20180830135615":{"name":"@atomist/sample-sdm","version":"0.5.1-noise.20180830135615","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180829152002","@atomist/automation-client-ext-dashboard":"^1.0.0-M.1","@atomist/automation-client-ext-eventlog":"^1.0.0-M.1","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-master.20180830103116","@atomist/sdm-core":"^1.0.0-master.20180830104916","@atomist/sdm-pack-checkstyle":"^1.0.0-M.1","@atomist/sdm-pack-cloudfoundry":"^1.0.0-M.1","@atomist/sdm-pack-node":"^1.0.0-M.1","@atomist/sdm-pack-sloc":"^1.0.0-M.1","@atomist/sdm-pack-sonarqube":"^1.0.0-M.1","@atomist/sdm-pack-spring":"^1.0.0-M.1","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180830112313","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"3069a40bccf2664260b7ff8ee9ffbb3134233403","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-noise.20180830135615","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-/t7vq4fskz5y2DFQXu/BZeBzPP4MmC+kGaKe5+5Nw23jE6Dr+1MYMkHvlyKzFkYARr1MgBn3nZdxUhv+mo8k8w==","shasum":"350f08d1bd5317dc177396a1340a7e5024cf04e6","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-noise.20180830135615.tgz","fileCount":183,"unpackedSize":630765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbh/iCCRA9TVsSAnZWagAAxOwP/0jbrnfH+vO3YVOEPAbN\n28WHSlba9WrJjCtyChZR/FupJT+JB3pEo9lmNrN/caORHsF1ANJBA5WcaBUo\nNvcYuVUrx30KzNE2AIgutm1O6rpyGFQIGzXSrt4Z7aDWyhOsXQnfa4hesKSy\ne77Pu57k5682KznDineKLH9eR+3/4+rhKzTUQB6VaEAwtbvV8sZUOSuI8MYx\nAFoQ37pky/bBey7ZQZL/BHD5zOVh517+WHoPni+42L2iI3NZneZO3DLzeT3+\n5rgS1W9x8bdXk6IMisEA3OLtVDUhvLaQxWVINE2KYv6ndVmJ4QzrgsCw5v78\nqWH9SCOqkBst0OlV7vTEHguedgw6ShF2Ytr1HTIwBRvNXCmy+/8K0EgF/sjg\nsz6zemiq0KybaLgobTmdCDLRXJrwvDCHDTdBfSogM1HALrHD9IwSlw7uv0F+\nab7LqBV1supzjOpSqsa0ld25qzWsdK+w4wzZUzc6MM8+D9ZYegPatXts9/kA\nHwn23YE/hUx8SFIYsfLxiKrIhi3MgJAyRQ6JMYu3lfMQ66e5Wnzmy+gGlCZs\nyVNfyj+/RAarRk2XVWReHOfmuE0b2pmOtxp9EZ2tmjI32iLE1ktWjnIw2NzT\nwyO466FEAG3vJ8/XGVpKsD4Sho+A134KJa/vlHSY+CQf+2zd2nqiLM2l0M8e\nEfhr\r\n=XXt+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBj6JBO7RdMczr6ZuUAS29lbOwy5pKOGEIuU4E32ShIDAiEA9GXCscG9vlP8i5gUu4u8Ylq3M5j6kLPrSrvch4osFSU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-noise.20180830135615_1535637633358_0.2196822055719112"},"_hasShrinkwrap":false},"0.5.1-master.20180830163615":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180830163615","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180829152002","@atomist/automation-client-ext-dashboard":"^1.0.0-M.1","@atomist/automation-client-ext-eventlog":"^1.0.0-M.1","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-master.20180830103116","@atomist/sdm-core":"^1.0.0-master.20180830104916","@atomist/sdm-pack-checkstyle":"^1.0.0-M.1","@atomist/sdm-pack-cloudfoundry":"^1.0.0-M.1","@atomist/sdm-pack-node":"^1.0.0-M.1","@atomist/sdm-pack-sloc":"^1.0.0-M.1","@atomist/sdm-pack-sonarqube":"^1.0.0-M.1","@atomist/sdm-pack-spring":"^1.0.0-M.1","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180830112313","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1040399d777d2238c971d8fc74c2dd9304d203d2","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180830163615","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ffcc9KpNL+L0ONR7v7SoDsXi4zso6i7cq6naebsYYtpbM8e5F7VWNHyRoeTC1WRDlFu1QL9hrsunPgUzNWjhKA==","shasum":"8b34a1ca318f6a6b51bf535a01e3da36a9d75282","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180830163615.tgz","fileCount":183,"unpackedSize":630721,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbiB4eCRA9TVsSAnZWagAAZ5kP/3fJPp8rrsw+5cz5O3C/\nlD/Oilsn0dT83ZVZusJ9fmueciTWnddnT/TL7UtTnzCDUuMZ7Nn8PTQHg6sa\nfN6W838x44cva/d3eI8J5Z5N7913Hzn4Iib/zJxWizFIBl7MJbhZEImvHl8h\nMDPVFwn/RD9YCoZwBhgUmT+3ZL9Ww4Ly4eaoIWHdbJnDpVXrnlIzluyte6KH\nUAJ33T5Q54EhyD6chE4L83gVGsHVlBL1CrKcWARLLc0M2l287zzs/Svo4oI2\n2n1eDnF2oP35VSpDw2XzbFtgj86nFW+CfIN5nx8T7gEAvjvuWvgQNSlhYB0o\nDGtL2d4buKj1Zm3YypwwxfqKjRmQS9neIUPUgI9Gqa/I0pyloFWOVqhY1v4I\nJo7mXd/H50FwCCAhoQLoLSLjHgopifU3edTYZTsIqQ8gtlSd610PivvROywQ\nUDVcFjCZGsvSu8UffCjh4D/AXdLnjzUwGjjouxs/gc6d9Rkx++OxYviwd50/\nPzZZFdj2ewwMnYqbLR86OGOTiC+V3QtRywokT1qos/1xSOoTAgzuG0Gyk2yA\nR8zHgY3i5JnmWpw6+3+07k4/ztR+3KpcHdW4iulIB+GO4r+kycYJHkqLf+M2\n7dNkSSLXvY4YVFpIqNcgo9cBW1c0kCrEqDDL8rWArZNZ1+7XvqTlerrrCtKG\nYeDa\r\n=DNXn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIATXFT2AjVA46dkDGNjygOzaurXHcVZZpjZ3mmbseeG/AiBDD8tjJAye+K5MyN688MDZQIJBNWVGJ7oLEMSqJCo7Hw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180830163615_1535647262022_0.9799234044526521"},"_hasShrinkwrap":false},"0.5.1-master.20180830173111":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180830173111","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180829152002","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180829090955","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180829152033","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"1.0.0-master.20180830163028","@atomist/sdm-core":"1.0.0-master.20180830172204","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180829151606","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180829162825","@atomist/sdm-pack-node":"1.0.0-master.20180829151541","@atomist/sdm-pack-sloc":"1.0.0-master.20180829090313","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180829151550","@atomist/sdm-pack-spring":"1.0.0-master.20180829151558","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180830112313","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"1a343326f31c3bfbd7c855db7388b23aaf6c6474","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180830173111","_npmVersion":"6.4.0","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-kfYggAs48RtNHw7J6tFZpfFC7HFlgRn8g6rs3n5HBzOp4lrcwO+VVFuRSWrdCqvlAKG0mqJIN+TQf6x2TEIv4g==","shasum":"f94546e1a01765998ea4f9b726e247c5c4391855","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180830173111.tgz","fileCount":183,"unpackedSize":630720,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbiCq4CRA9TVsSAnZWagAAlasP/1YchoWd6nO5PQSgf8L4\nEhhE/dhi1pjoL1RsLHhJ1NtgzZwB7bG7lr7dRX7ktx89vFT+L5VVkWOGy2co\njDETYEIiM75lReBV+lq8+Z1NQfhKpZmnGFiPTcQTGnBPjBbCjJktpCfOkJre\nJHmGadj6f+gOUskKfThUlc7RHnm14VsnhB1FNkupBRtumqj2hXlOrjWfXiUv\nzdGdGcmfBDPRMJ81p1ntXeB4ILBeRh4ioi1oMiQY6znUCyXx6pwJiWXJuH2h\nHbtPY9J36TE2WTOj7LH2Wu1yV6Mkn8wloMG1SLbIHb8/1NoSbzAAdIXm/NvI\naJkqZZG4l8ZtAls77VzeUUE+cqX5jTvYDK2ZcZReX7KK+TnIE8I7zk/Mrqxu\nyxohXGM6TZJ0swZqdPfpM0+BfXtNIvb79cpgsTM3LYCVEgpMeuYFnhxPK0nw\nuMtRM7TnPzNr//V/+FtEPZ4WOzfBAjzADEbxJadlX+QqGBTobHboHEo/MzmL\naQ1kV96Mqm42/cSuoFZ5Ak+b5+OZqlxqzXQbhR8AvVHnkVvEClo6xbB+DkGd\nbaBdqV26yUQln6UVBVC7lD03e1yDy1nfKgk/Imc0d5vsr73qXKMcTEeSJUzw\nDo3D0EBUMr46/Qny0ko5hEmll4mEqyxua/Je5R4qbOpmaFiCw/TEX5NkmzH5\nvPG9\r\n=oY1m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3uzrysfHQY/QZIuBkOtFbOjPkijYBeZEzBnNSvQJeJAIgS715F7YFjDWCyPBJs9QN3nDpUQskEU8QpuDjtvsGJ1g="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180830173111_1535650487154_0.14367660463547827"},"_hasShrinkwrap":false},"0.5.1-master.20180905005014":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180905005014","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-master.20180904201520","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180829090955","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180829152033","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-master.20180905004040","@atomist/sdm-core":"^1.0.0-master.20180904154825","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180829151606","@atomist/sdm-pack-cloudfoundry":"^1.0.0-master.20180904181051","@atomist/sdm-pack-node":"^1.0.0-master.20180904164452","@atomist/sdm-pack-sloc":"1.0.0-master.20180829090313","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180829151550","@atomist/sdm-pack-spring":"^1.0.0-master.20180904172213","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-master.20180904180944","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"edce787d1881ab32a05a69b1d209fbe268f552f5","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180905005014","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-SnjE9DY0Ug+hx1RgCdlGHDkA9yXwPyQUZ9S3cbeyEOs3pytV9cFCFAntKB/OSbnuJh0dTBEI1ari+CKG80mjmQ==","shasum":"cb18097a1af8a232478b4b260fb8b6b3607be94a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180905005014.tgz","fileCount":177,"unpackedSize":615338,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbjyjBCRA9TVsSAnZWagAAhVYP/RxVLj2H9maITPI1ggvS\n8GGl5TmvrKzyiudUCIf/4HLYKZ5OPxMAeAbQKUz57J/RGP1NvkEQbnQ0Ujfk\nWbIZjVsy+9O1MxRWwSk/ZsqA7k81v88MYUK8ne555Wjs84uVrYVlcvxERKt0\nJA3m3dJDh/u1Kf1YGkuWUGAowA1EZ/D7tddBJCy9wBJcZBVooij3x4pBrdfj\nIhXTqPX8Sb19LomNFe/oEGLz4RlgkNDfpXmdnGVacc23O+prsjnQFlTmm5Sh\ntLB+IXALnxmMbv6D0Cx4cf9h/5WW9GALlocOfIeMlRKr6PuRemYL0YTJu3IW\nv0/DdkYY7lW8/BP3WtRoTZs3E+JrVPKCKlNCIVcngPbHxwZ7XEK2wu+YHjAz\nRpa7q+TTpqM58VUcZuxm85pp4V3v5g/8LVxdjno44I3SBmuDL5NVwqFMMWYm\n6upvQdPiy29rkz2ZpTFDLzO7j/+L2MTVRQS2snyFjS1Y9FUrRtCAqzfWj+ze\nzeoMiA1JqR+SJ/Tkd9/wtr6xpbooTx1aEh080I6Rzs1gyi51JXJQbqPOoBsH\nF81zC+0uweJzKby6b44Cp7F9jlORQZDL3H5w/9Xzz8aSCcx2kcOMUMkihCXb\n/PyAHPoE6f9M9E7YytgqMQuBPeh6AFm3tCSu7ESqsu0O+d/lLyBOngDBJhYS\na/94\r\n=Z8qP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHTuYtZ+PEt7uJLn+t2Hjh8M7/hIwYpJHkOAgKW7eGtgAiEAhpj9hx1F0J4Q/+mmeP02LJ4shyjxhtPl9QZC2u1D678="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180905005014_1536108736833_0.13022906299479997"},"_hasShrinkwrap":false},"0.5.1-master.20180905011214":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180905011214","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-master.20180904201520","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180829090955","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180829152033","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-master.20180905004040","@atomist/sdm-core":"^1.0.0-master.20180904154825","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180829151606","@atomist/sdm-pack-cloudfoundry":"https://r.atomist.com/1493932052","@atomist/sdm-pack-node":"^1.0.0-master.20180904164452","@atomist/sdm-pack-sloc":"1.0.0-master.20180829090313","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180829151550","@atomist/sdm-pack-spring":"^1.0.0-master.20180904172213","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-master.20180904180944","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d622a014de5b72d55a42abcae2b53ab2102d315e","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180905011214","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-0d64jVzRlC9ZiTvISYcqZ9h+FbgzmbK1vCiH44Rj5F3IiD5nXd3vV+02tqqW/BV5iqAkgdLvB7viDzRqp/fU6Q==","shasum":"e43356891474662cf9bab7dcd352d12576790db0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180905011214.tgz","fileCount":165,"unpackedSize":595412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbjy3nCRA9TVsSAnZWagAAyCsP/i+1fSinXiikreFUFke1\nH5YkGOf42l2doPuVf8rHdr+gP3uqKSkMgPeJqoJiIus94+SnhTWqA4D53SuA\nXgLg5bsOWe/sDwPfGeweEn6tzbtGWD+KI5e7FG7uwjsUXMlp2WPfw8l1SIzb\ngozvRhUOWKR9utcLfeJZ6+RJ5MeRWMb4R8OQmPFtsBMbyn0ebh7hGRnMLo7g\ncE5glEK4L2B+m6PXzRN8ePfZ6zRTZ2cJ90/GT5Z7d1Gd+4ZAMQOLjc5AJAXE\nID8eyLxtTcb9x/WGwExuXWuI/6sJH1sNDcNi5DGNutYpa/TnH+vjSiP5FujU\ninM3kwKvWQmYuMDPnQ9yjUxwNQIv78widg+IM2i82oNaALT8vRV2yM4owpT5\n6XPYEOxSNd6oC0wai7WYi8M7AksfcIWncYm7nptMsGfnWU6TvhEgwz2CxcOd\n3i9IEU21jZvndPy/xSWLZNzoh193gB6rqFtQ8G3461wrITgNeF3iwf6KCYkY\n2VK9caxHdW05AK2QehLzKX3ZZAugSxJvyP6G2HZ/GOFixvHC4RAqbB5x+Mpg\nvKBYDYAZHxzICyc/70y8F0iXv2MJpS5Uol80R4MY3/Dm8I9R655C+Ph8euKS\nZLZSrxKTa4zba+Vzg/rVR7xd38dwenOmdWNPr/3ISqUahjP/Lu8iUSKyd4+n\nAI2F\r\n=wiFq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE65wkDWkLvsC7oCgw7PUtLoMa9MSGpDKrbC22tvh4XAAiEAxSI6gySgmPCRau7ynIGAfu9FIDK3esZuwendAkayYgM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180905011214_1536110054435_0.11921658333996188"},"_hasShrinkwrap":false},"0.5.1-update-m3.20180905082018":{"name":"@atomist/sample-sdm","version":"0.5.1-update-m3.20180905082018","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-M.3","@atomist/automation-client-ext-dashboard":"1.0.0-M.3","@atomist/automation-client-ext-eventlog":"1.0.0-M.3","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"1.0.0-master.20180905004040","@atomist/sdm-core":"1.0.0-M.3","@atomist/sdm-pack-checkstyle":"1.0.0-M.3","@atomist/sdm-pack-cloudfoundry":"1.0.0-M.3","@atomist/sdm-pack-node":"1.0.0-M.3","@atomist/sdm-pack-sloc":"1.0.0-M.3","@atomist/sdm-pack-sonarqube":"1.0.0-M.3","@atomist/sdm-pack-spring":"1.0.0-M.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-M.3","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"bd6d0169bcde7234f36c56d5faef119f718f0379","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-update-m3.20180905082018","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-GniY5O7BnzTBpUS0AfaLj/rtQAcLrcpZK2eUa3+q/YsCnpSgtFTkJ3W0a1XDgx3+eD19E0cUOv7SKQbiopHN5Q==","shasum":"fabd7c93c802c3d0afaba5f88e816fd1f5d17a5f","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-update-m3.20180905082018.tgz","fileCount":165,"unpackedSize":595206,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbj5I6CRA9TVsSAnZWagAAmWwQAJRP9OJG3qo7QNzlgYG+\nMUmrouOUdXxsCuddWn2+VIOuLDCik8kHK0Mi89+dqgJhFbwrP30kLOBPmfug\nbfNi9BGWlg7cfu0BnG0jOYr2gi40AFDf363yqO3MyO+I97HoyQrpqdIFdtIN\nLp89CW7uqL/+cWvEGkCPGmGPEeU2h9NwFKikT/BgkrBH3/h6aesGur7/iF/C\nZcWVSI/wzVD/VvOlUzNfZlSEXf7wfEKxfzWRAGIqIjalJF1tIziOVGM3xQQt\n6q4svBI+Tyr9L9No+/n31X9fCNx3O1D91awWA/RU0/ofcWm+ygd+I2Msmr1/\n1ctWGMzE56WhebXLcf5N1EGnGlsfW0paIp16OD/1iaK3tLD/Cy8uib8FEtlE\niWMnazHz1ijPa0eWFCyNMopfpjpdaB8tV5LOdy8x4xh8T/1eC07Pz40zlNNB\npQKBhzHJ5ptwCv6/oD6siLMvgpBANPZ+vgJEM+S/qrlcCF6XwUH8pBSWAmFO\n6f7NPuzkP+sKeeMJlw0gmmUHYly9sPHrT0wq7/RTyIUCK7Hue2ndA41YOnC/\nD8qXqcYS1YDXtudqPxPfapgqM3Muj9qmahUMov5YFmQTK51W77Ktww1Ugqhe\nc0bnZHXdWCbUkI6Fy2WP1oGgD2NjRhei01Jt7VzUBsuo+p/WotGcsPmiA1pA\naNM1\r\n=mZ1T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGJvkTfoZAfV6/2/vwHpi0wFyerL6oG43VJq3C5zaAMrAiEApK/75fTOnQPC7xfYM6xeT3X4S6SCn+xDjBDsUixDrX0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-update-m3.20180905082018_1536135738060_0.8994438445319344"},"_hasShrinkwrap":false},"0.5.1-master.20180905091816":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180905091816","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-master.20180904201520","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180829090955","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180829152033","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"^1.0.0-master.20180905004040","@atomist/sdm-core":"^1.0.0-master.20180904154825","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180829151606","@atomist/sdm-pack-cloudfoundry":"https://r.atomist.com/1493932052","@atomist/sdm-pack-node":"^1.0.0-master.20180904164452","@atomist/sdm-pack-sloc":"1.0.0-master.20180829090313","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180829151550","@atomist/sdm-pack-spring":"^1.0.0-master.20180904172213","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-master.20180904180944","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"d622a014de5b72d55a42abcae2b53ab2102d315e","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180905091816","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-cnwlzxU4BKsRZU7rDD1PEG3KOhM4mGO9Hvphs5Dwi5zaCo1W8P/F/ZC2IO8stYCirVL/X/0UmoTF/I1icEKeow==","shasum":"bf38c934b107e18c3f1cbfe5ad1db052b01ca26e","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180905091816.tgz","fileCount":165,"unpackedSize":595412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbj5/rCRA9TVsSAnZWagAAB9AP/REIU7RUl/qkYYrcI6PN\nf+hvtLuBHUHvlSbaf0FtzB6TvrQu9YKe/6VTH+GeBneJ7XGOv4bp6NoxyTXK\nRLoFaCUrVe9hFs7rQ1JSe/7OlofMOA70K70T2Hb4uvzWBmWuvHeN9CddhOCb\ntFY0LoWsY7XsvsQDGoaRP67u3YYVAmta3RFDr/3Y/1/fI+0LIPCUkzOzlbUS\nsxOjWdr25C61MBDMEG7OgITCAVApBQxOsm6uXk0UgenvmI/gjl39BHFMSbAt\nmZyMyzfaXq+HfSoIrQ4pmKxgpUmWwwdseB9GzRriskahvKWJvFoSqmgPigus\nJ0Zh9GQdvpkMlcX4IKwongIkLDlEHLiY3oM58TgVX3Rudx+n5VVdXYpOAinj\nI+RoOoy0/28BM8xQUD2yDLacYMyKS6Q1bVW4PQj+tI9uPy7o+NiqYBWz47OI\nCI+jvYtz2ZZ9AAZZ62qQjuIUzQ7Z5/CAy2DkvZicaGnsWq7YE0zUq8tMi7ef\naCTMWAjDKLvHhKxu2/vf3iUAQaDudyR8TUNtoCAdDCJiTpfciIKu7M+q9UMQ\n219LMntSLFJ1fWmf9TZW9Q5E9biNwlC8SzllWa/GuIjpXEzwXXN4KK9LXOlt\nozmFLv7sokwi35mK+n+LmiGNVLwumSKlqAFhExCJxomyIGLLQ1d8p9WWoR7k\nE3Ap\r\n=inhT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtMh+AZL7nRHAoBLUA6s9uKOEr8Z3F/A6v/nDluVVyaQIgT3daqLt8FiGOpKr42vWKOfpiwSRV9rjJYk+rD4pkkA0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180905091816_1536139242838_0.1702954712628626"},"_hasShrinkwrap":false},"0.5.1-update-m3.20180905093907":{"name":"@atomist/sample-sdm","version":"0.5.1-update-m3.20180905093907","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-M.3","@atomist/automation-client-ext-dashboard":"1.0.0-M.3","@atomist/automation-client-ext-eventlog":"1.0.0-M.3","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"1.0.0-master.20180905004040","@atomist/sdm-core":"1.0.0-M.3","@atomist/sdm-pack-checkstyle":"1.0.0-M.3","@atomist/sdm-pack-cloudfoundry":"1.0.0-M.3","@atomist/sdm-pack-node":"1.0.0-M.3","@atomist/sdm-pack-sloc":"1.0.0-M.3","@atomist/sdm-pack-sonarqube":"1.0.0-M.3","@atomist/sdm-pack-spring":"1.0.0-M.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-M.3","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"6ececfadb6659ba379e39b68185506e62615b0b6","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-update-m3.20180905093907","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-aRsvl8a9dcd2RqDyvDTOo02EYi5/L9anX5d43pyxkmD9SPBHh/NVAvn3AN1T0kCG41RECottdVgM4AGV52lanQ==","shasum":"996be98d68878f5ef58f664cf01d689c4c5d7139","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-update-m3.20180905093907.tgz","fileCount":165,"unpackedSize":596219,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbj6SzCRA9TVsSAnZWagAAcE4P/2nHBCV1tYJ8fIHXL4Lm\n3ps2GtWcpdGGT5ZF2qU/Xm7g9n+x/aBl3dbPfQqESXRAlRrxSiJIoalxV86X\nFhCCVeqXbANHkj5m+wTCQETpl5zQy2RlTblgRG/TrsWz3WwIcIb6KW4EQPWX\nU/eiJ3jI+PDHBGPB+bSrjokGG+DRpO8WRMm2SwBZ+VvYFW1DaNNPdZEqdDpC\npgb40Ta1DFFnjaUurIsh1RJ5Zp+GXxk3bLU7nBc1I4TooCdV0AaV8AcU0Ymm\nUG/jVueHqWXVPu6TejohyzOWR/bMdnkW+QHrEwlgqpRbk/Z+pQsRRvTZI1le\nu6WRa2daXpW1omCUzNdLOyUDjjm23EzkVlBO17ZC129JCtokAbNv45dYpOM/\nwyjPeALHcavhnsdq8gNXnyWyFKlVyhaU9HN5Q2nnDDqAQ2TVtP7Lb77FbfkU\nA6HtEhsx8UtBZz9XCLvTcRyg8KUL9+ERYoBEucnPdnHVo7kYaaCPGhh8VG5L\nWl4EpX18y7TUYu24fA5RJmcB1GWR5B4nLLKaZYl3FbelZGPnHwH7JStv7GL0\niVg3ys9+yTv7HF38+wxO+pVU5qSzfx3AoMIT+JNkV0v7AwkrbmQ0KVri9Wwq\nvfyD1/fKgQb02k4uXf8xwtzILswVwijT5UZYLDEVZaQYJqT8DMYf250NDZ7f\nVXTR\r\n=fhe5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAuGTIOzFSLqw3K8DkfkmHRXwe0WRDzUcmZNQNuN4AVmAiA+mvXSsCGwhzrFsvf5QAO4Xa/1/hk4l7mZtbLhVn4/xA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-update-m3.20180905093907_1536140466978_0.9724376448882823"},"_hasShrinkwrap":false},"0.5.1-master.20180906160318":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180906160318","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-M.3","@atomist/automation-client-ext-dashboard":"1.0.0-M.3","@atomist/automation-client-ext-eventlog":"1.0.0-M.3","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"1.0.0-master.20180905004040","@atomist/sdm-core":"1.0.0-M.3","@atomist/sdm-pack-checkstyle":"1.0.0-M.3","@atomist/sdm-pack-cloudfoundry":"^1.0.0-master.20180905010250","@atomist/sdm-pack-node":"1.0.0-M.3","@atomist/sdm-pack-sloc":"1.0.0-M.3","@atomist/sdm-pack-sonarqube":"1.0.0-M.3","@atomist/sdm-pack-spring":"1.0.0-M.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-M.3","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"f5d088a0e0da499166dc3a5ef828ea1dda4faa6c","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180906160318","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-g3TYR/v1wSWTmtoM/iMmZYx1Pg/kKE4RWhhtj9bIOL0wDdq3sUCna0Qww7rnz6dE9Er2qGMXEx1zAnDH8DNeMw==","shasum":"ace72ce074e1fc146a12d276c2ff319432d29ba0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180906160318.tgz","fileCount":165,"unpackedSize":593749,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbkVBNCRA9TVsSAnZWagAAwLcP/1DMQxxNzXPLGvoZyCm+\nhKOGbSqV1HGtG/H1iSO9nJnfJdfPwLf+cgNTh/k/zRD4OFAuxuT0gShNOW/y\nuIG3NJln41MlfmKRne7AprD8fOnByBMcL8+WzPanoTqG6pEVRynK9mW8FvI+\npM8GLuNUZxf3b9GZ0bskbz2k0Ctksb1xzxqwGqanXr+G46+Zl82sfEDROH+N\nGmTnrKreksY+JgnBvWslTj8oCyzvQ7SnRauMjMyqknlNfTIwtT0EKeEzvG+E\nWqveHTYOLmSakdrZ6vUUhyFsqUrvB8UYL6T6SkBMgkN0t6LJKvqBlJ1uVuPh\niIPV7dc5PVOW1mnzsQulA9KEergSU9pRbPg8SrjELzYFv+HU6biPZi88Ajt2\nN6y93AbUHBpnDEHQGQbIcYZX1p/0FHCe27U5vS3aEFbcchOSnRlN0W4CyweE\nqW13Gt4DDglTFwUuawGMkjNaOF2m/xTmGoEuBtYoS7szcsNjpghtphmcdEq9\nInApYiM8ZLF9j8CWvegXrTZ2BTAblTcqqyxi3CqXr7GmzpLqzInAUTWUCPIG\nNJOTqOLzQ4EaA+MzBdNf4mTGr88s/PkBIN77MJLXL4zi8O9L+fi9MXNoIkYT\n5X+Y/Yu3tv9rEgPrR/1tKKMcknQummZJdtuEVEQGmJ2GQFBCSbSatcKLXVFU\nvvFE\r\n=PyfA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEFwA9bcNIoYXGrcdUxBUMfb1G1aUo4N7WCkbfhbbvBQIhAMnl8kvy1IgKA+mABD5lSm2sj6G+PfmBzcPkobQD3x6i"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180906160318_1536249933143_0.21071331147990424"},"_hasShrinkwrap":false},"0.5.1-master.20180907225630":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180907225630","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180907111850","@atomist/automation-client-ext-dashboard":"1.0.0-M.3","@atomist/automation-client-ext-eventlog":"1.0.0-M.3","@atomist/microgrammar":"^0.8.1","@atomist/sdm":"1.0.0-master.20180907223209","@atomist/sdm-core":"1.0.0-master.20180904154825","@atomist/sdm-pack-checkstyle":"1.0.0-M.3","@atomist/sdm-pack-cloudfoundry":"^1.0.0-master.20180905010250","@atomist/sdm-pack-node":"1.0.0-M.3","@atomist/sdm-pack-sloc":"1.0.0-M.3","@atomist/sdm-pack-sonarqube":"1.0.0-M.3","@atomist/sdm-pack-spring":"1.0.0-M.3","@atomist/slack-messages":"^0.12.1","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180907085349","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"gitHead":"e8cbcf325d206492f0bfd43dd7c8eac1da3cbb08","readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","_id":"@atomist/sample-sdm@0.5.1-master.20180907225630","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-rx1dFJwwQzd8AmttYydjIgLOzHBVB6eV8FL+o21dvvh6WfYAHTjLsdOznYO1Vy2TFOcvMuNzoOlu0leYRcLVjg==","shasum":"abfaed128eecf2e44de64b66702b35c71f235e07","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180907225630.tgz","fileCount":165,"unpackedSize":594045,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbkwK6CRA9TVsSAnZWagAAyO4P+wZLNpmBiGJ27gYlS+AJ\nvrsB4s5f3u/6COD4pVVpzoNKDgOfldqXt+hBpqLC9VL0IJ/c4jYbX33ti22e\ncaAAuXw6YcWjv+xxFG/zQ5EkjY6xHo7q25LrFhNfdKCEPRqtcGTumHZ2EjC3\n8iGh+hEZ6j5ScBj5TfPhI0/haGziRt0w+sNk9colOo8QMxbZcRCig5uw4iSU\nB+Qj2hA90NS9stPe1RaxFsCCRfWf/RdXG3YLG3PHspk8o/A0MmWCK8FV/oyp\nd7PSf9L0lf6seq8SADvich/4Kc8Xa05n+6sZP9ZO6+tPw5laL9x+7nC/iwvu\nGjsvLd4NF7NBbOvyrpm27wkVPtKZHEy84HbFcwY/AHH7VubDMnJbFIbR8J/f\nVlXKdfZTU+FAMirNv7aXmlGb/yPzlrH7X8EM2ekYRskAF6zBbUyDrlzpL5t0\nKVzX27KbaFcDfmJvU9wFxy8Ov8JWXiDph3uCAtV9NfGcCmgtpno/gis7ofrC\nQSpyfAPGnescFuqit8alrncKFxQJig8J7p3k1eFl+ahiudLhgv1jUz5maEWj\nJ3XK7ZPbIDWsceSRVrdHEvHqtvuxOQ/hvpS5XgFQRAbxHx1sV9R2M9QEoKua\n3UJEA0P0QLh8H6Qe4ecn4p+tomcYJNhYhq/a+FHz+iLMkeGJ4yj2mpbhM286\njet7\r\n=hFjp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCY5J0xf7CA/fV5xO/2tdes9k367L8ZKrt9hJkeaoqQeQIgP/FNoKLZ5/dYEK2Z447g2ayr7OAUFI00I3d2Qz1zHi8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180907225630_1536361145818_0.003042052393050554"},"_hasShrinkwrap":false},"0.5.1-atomist-update-branch-master-1536937963186.20180914175421":{"name":"@atomist/sample-sdm","version":"0.5.1-atomist-update-branch-master-1536937963186.20180914175421","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180914125809","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180914122336","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180914124626","@atomist/microgrammar":"1.0.0-master.20180829162516","@atomist/sdm":"1.0.0-master.20180914145042","@atomist/sdm-core":"1.0.0-master.20180914141908","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180914174258","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180914144948","@atomist/sdm-pack-node":"1.0.0-master.20180914135449","@atomist/sdm-pack-sloc":"1.0.0-master.20180914131522","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180914174720","@atomist/sdm-pack-spring":"1.0.0-master.20180914134627","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180914124214","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"025a10fd7fda797689323372c329a48136c8a910","_id":"@atomist/sample-sdm@0.5.1-atomist-update-branch-master-1536937963186.20180914175421","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-7DLhnHD2CHeJQo90YbwgjC7qMwE1DyYNmxPWGR72lw2dwwr+MUcVGz1pCpFFCSimTnw5/0juXbz0O86UF2r4Bg==","shasum":"1ef2df2fabef3af23b17a1b9bfcbbeb83eeabfd8","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-atomist-update-branch-master-1536937963186.20180914175421.tgz","fileCount":165,"unpackedSize":591008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbm/ZiCRA9TVsSAnZWagAAIqcQAIWrYH+H9Tx1kc8d5lNM\nxp18mC1tpJizTCxP/06bRAXi62Mm+9kMO7LzGRer0sR6lqjucQ38hph9rylA\n/gMwPzJHQpzYjGEk1qYO+kEGSNBKgIKSsd5cvIUcPZ5J5fygMVe/CJ+gj8Wt\n0pokCDA+f7wwpVx1AWfxpg9//HK/LLfNruLAmf1H6G1bcqP9kuYPJ5PFlde+\nnt8ckgLixVz3HC8tVeXlhsOno/y/aEjX5ifLDpHpR0eofKJiPeWYcIel4XZA\nMEts/AImwzugwLW6cTg5uvEqQ8S8EeFYQkGDGkxTR6AQBQ/toHhvxR62EfQb\n1qSM/23y/44rlPSa6uCbocwzKa+7mctDNZALoxOSeqTbTAJzpji9tjY78QiF\nkJTtODWzRhaQwONsiNQddyA+AnMUrZ8WJBR7PUDVMMNG6KlKlDVSyo51tiBX\n+yhmjuQlbEgYBY1Q1YfK+CQCUWejF9plWdRihbiyJiiJvIH9X6jwTylKo2MJ\nVKitcuMXeNGDrSanx1ovIYgJ1D2l8BSKjPP2u94yHUKLxvC5B61yBCfg43BA\neczYsq5BMv2AM4dzGrc4g1XqRtYtCGWsESVFlhwi1RRB3xojaR1W1HeCrxeH\nfmiW4hPZasOhf93zHtiCYs8D0qCuMgpwRk1XM4/nAMMjx/mWJKk3zKe+fOMo\nywvh\r\n=/NAo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDssNoZ6n2HbYJKF4T0urV3MX1ArcxDyjNPfsZqnbf29AIhAOzsAsolebI18d4H8ixkjWPwNwG/54uJzDYwgjQ2QweL"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-atomist-update-branch-master-1536937963186.20180914175421_1536947808615_0.6918171689286028"},"_hasShrinkwrap":false},"0.5.1-master.20180914180007":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180914180007","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180914125809","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180914122336","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180914124626","@atomist/microgrammar":"1.0.0-master.20180829162516","@atomist/sdm":"1.0.0-master.20180914145042","@atomist/sdm-core":"1.0.0-master.20180914141908","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180914174258","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180914144948","@atomist/sdm-pack-node":"1.0.0-master.20180914135449","@atomist/sdm-pack-sloc":"1.0.0-master.20180914131522","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180914174720","@atomist/sdm-pack-spring":"1.0.0-master.20180914134627","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180914124214","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"e5b7030e7b62cd77e763d6452de2276f31b5b4ca","_id":"@atomist/sample-sdm@0.5.1-master.20180914180007","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-lCgvFBu8Rl4Wh1wvWEHO7ftgGVW2BHY/c2xwkovf4Rqi8lrEwRCMvYonXm3ntn/y/AJ4pcEEvkrRL8gzS+mCBg==","shasum":"254b367b3d9683e8264e058ebfa328b0ac69cc34","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180914180007.tgz","fileCount":165,"unpackedSize":602013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbm/ezCRA9TVsSAnZWagAAKW4P/iygRyyKsIrJexcpT2OV\niYoIEHPPUDDscVgF2JR/9aBBrtGbYyzHhzAxYXAeTPevh1HRGPGr8+j4/9pY\nEoLSTyuf3WsIRO46OOwsekH+tZYwthW+aVhja6v3FfsqGB6mYI5CXI/WC61r\nQFrPP0Au/b0fnJr9JPXShNwand+BWobZ96/4SHfeGj5TpPcyuNE0bjR9IyyF\nh7tC47PbpAdRYakdjNpDilmouq9s2Y6U/qRN2m+zLEaxxIkwyMJvDAf9cUJc\nB4rvd8Z3jozQ2u5cgXPSsUKn4E0joChXdNoGd2IeM2ugHyiA3xQHq+TunJr/\nm8oS1QWeeLSO541IHVihW8lJNDvJ46C5t/8jW9G+bzqsNjU8opf+HhTy0vtf\nAVHwo7TryfhEVa7aAkNcQGI4ieGv0VMRpPzzd9qYr3fHTFGvsMlxxtB1YMfd\nZKWALn81RmweyulLXlodbzcCKn+OadV8TPwJ03bY7+i3iaSYnoD0RBAZGe2Z\nKpLEZ8KBhAu+G5yOOZ8qRYwMBHLWYAbFogd0xsxMhhUFcTe/zbL5AGaSaRoY\n7JB+SpkwPVIigk6a6r1D4px25FFdchb2FzTZjpzb84ljnu0YT7Z8hQMc9mm3\n2KnJVSxLjsaQziO6UmDRjxAWzHaqSCFWx8p+ZTyauAIgiXITuGu6GiijHijS\nIHqM\r\n=vCZ5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHQ/9YBEkVhcwbR7LVixUCq4s267c8K0arFGAd0S4bVQIhAKdo3uQOv7nDJ7yIQgrCnEcWpMIyyi7YdVnZmQu/QPgm"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180914180007_1536948146578_0.4994573983838464"},"_hasShrinkwrap":false},"0.5.1-master.20180914182742":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180914182742","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180914125809","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180914122336","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180914124626","@atomist/microgrammar":"1.0.0-master.20180829162516","@atomist/sdm":"1.0.0-master.20180914145042","@atomist/sdm-core":"1.0.0-master.20180914141908","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180914174258","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180914144948","@atomist/sdm-pack-node":"1.0.0-master.20180914135449","@atomist/sdm-pack-sloc":"1.0.0-master.20180914131522","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180914174720","@atomist/sdm-pack-spring":"1.0.0-master.20180914134627","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180914124214","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"2399467cb81763fffcc74a3a4dde1edb9b956ad7","_id":"@atomist/sample-sdm@0.5.1-master.20180914182742","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-vllk4BLmHafa6BL/4fDiUe/sx+6bT2HakR+0rMvwhHNzgyHG8yJ5uL8xtRD3HMFLFugrSTRaaLXRZM++VpGjtg==","shasum":"b14d4ee64893fb30d37c65961d84c106eff5a432","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180914182742.tgz","fileCount":165,"unpackedSize":602013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbm/7yCRA9TVsSAnZWagAA3SQP/1jrT8Xy1hSkbvTFPBNT\netYC36hRzCM1oru+YPLfi4CqxSQzg9KDh60bel2TEWT5CNpAw5lJpRwanHGM\npMalMPBnpCikUVYgOU4U8+GQnkemAbJgW9R9N9iUo8Baek6bJzEb6feN2mDR\nLugOfobyhg+3aFlUigVk3ESDGm1PJDp2v2m5vnyapDLzYnNYJCyk1KQHOP3j\nx1HIkVG55I97v1iGuS7lGv5GyzKZySE91xbNM+Cc89uEN/aVlRImTVOyIXcA\nyWtl1bCj8tHLRbqJiRVohKVH8iLF9ua9iw1TjK6ij41Krt53SDWRlf+13Xt9\n51ECUqdlV5vewCznUduq+6Z3EopuXUezrV3dbsFzTZDxnEXhF36mbSuvUtV1\nzBsUInkLL93WvTgS0vhZhNzEtrAcHin22VIe6MN7q5rG1bOgSADCfS5KZNFL\nqpPxMBi8uAh1Y82IYZ9cFmkWMKCkDSH5+8pvOMhn5hwbXbuHARhmRG6cRzML\nhHswVgbofrHgCXsD9/8HGFzrIWHZr0Ybyj7fhga7lImoR11uEC89ruo6gHnV\nFNOVfGlu266qdlV0jYXTVSiBKioMRj2mWunlApWC9MR9jEXSHcAx8WTtGvo2\nGvABwctcRhsFmh3mM/62RtMCaFmZG3FQPjYhnbiie5EvXca9U0hi5e+8I9S+\nZy92\r\n=dd7H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9uC+WcAnV+8dajeSTA8/Va+HwjVO7G8KH3G8Og25h/wIhAKAzgUrTbmUzyn5yv24rrIHNstwGmhcxGnOCojRzy0A5"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180914182742_1536950002118_0.20508990756092227"},"_hasShrinkwrap":false},"0.5.1-pcf-goal.20180918031256":{"name":"@atomist/sample-sdm","version":"0.5.1-pcf-goal.20180918031256","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180914125809","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180914122336","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180914124626","@atomist/microgrammar":"1.0.0-master.20180829162516","@atomist/sdm":"1.0.0-master.20180914145042","@atomist/sdm-core":"1.0.0-master.20180914141908","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180914174258","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180914144948","@atomist/sdm-pack-node":"1.0.0-master.20180914135449","@atomist/sdm-pack-sloc":"1.0.0-master.20180914131522","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180914174720","@atomist/sdm-pack-spring":"1.0.0-master.20180914134627","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180914124214","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"08ebf4a00e9811334812610578ce9954645eab2e","_id":"@atomist/sample-sdm@0.5.1-pcf-goal.20180918031256","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-MRZbZLEDkaXkI6PFDv72h47LBYELJZ5pUs89ak+3TUfxBk2Mwm4YWUgGwUVYoW+F6LffE7qMQgL73wKAutBugA==","shasum":"4e185be332f8090b217f92be4d8407b9b84df7ae","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-pcf-goal.20180918031256.tgz","fileCount":171,"unpackedSize":607252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJboG3NCRA9TVsSAnZWagAARcwQAI9BMWLNLhXCthC6ICsH\nSoOjr+1tosT6ZBoy7iZ7VTqZ+UInvTOKsAt9jTbTUc1ZFGQ4DNxQ49REFmB6\ngosbjlV3KWiQb4HM+7wnmH4WLNEmOg7MZ4v8be7UWqeA+Lo5pbUc9YaVo5Df\nZyzT7Ucp9IzLXpGmTXguUXOm+ydnnxB6Ar0x2R1KuyxLAvvLwVDYbMYudnB/\nM6AAQoBTLX0GtJ0URkFrDlLH1ZFoYlDu21P0xb8wEcQfluGvfxx1rPSqYv5d\nDDaroOEeigGKMNdrSZ0Q66x0DNbjMSvYpWI0/pCmUR2Gv6Zwkhx4Uusdv08q\n8erXqTWjwgeexV8ctp4lPLZxQj8wbwSYNUwhObvUHaV/A43O27Rj9+9+QxOl\n1dJzCOx2gmIBtRLGCx6QcHCSRrZPm7MEcTsBeJ9TqEHmziJ3WaEfpWzQDEkM\nXIka3LDv42EMIgLChmNaE4Ncy1agEON+qL32xrLaYuAmADyUXby8c3ryrnTo\nqILGD2A4i1rP7fjKAxGppA0VRx0izESLf8LRxjt8YEJXUUQaxVpH34h/T4HD\nEK8GobR2X5aeNbL6UmSethG3sLNmr++dL/489pM6hxTGp5OEqRegoE5MABs0\nqXA8U8JtzDWSrUI+Vg5+wtCmRXuA2QNE/99zYSr7NZ0TGhSwFEEkuyIcmYVD\ncRpY\r\n=Na2q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH2/55c44I3nhMmDChZfmAyA2yO7VBMr1qI5RCm0jyznAiBLHob2nyKapnC+zXza8VIONzwaDUgRS1/ENrNMgnDsRw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-pcf-goal.20180918031256_1537240524352_0.6664296020698979"},"_hasShrinkwrap":false},"0.5.1-master.20180919041321":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180919041321","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180914125809","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180914122336","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180914124626","@atomist/microgrammar":"1.0.0-master.20180829162516","@atomist/sdm":"1.0.0-master.20180914145042","@atomist/sdm-core":"1.0.0-master.20180914141908","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180914174258","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180914144948","@atomist/sdm-pack-node":"1.0.0-master.20180914135449","@atomist/sdm-pack-sloc":"1.0.0-master.20180914131522","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180914174720","@atomist/sdm-pack-spring":"1.0.0-master.20180914134627","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180914124214","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"56104488b4ff04e19f20ebf032ec48b8be3fa05f","_id":"@atomist/sample-sdm@0.5.1-master.20180919041321","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-QDaPoVv4eB1OogsvC2ofE4c66EhkDGxL0VYzrNw3Xjl6Q0Tj7zzmul3EB7PYNSNcop6hPgYafD5KYZ2g/9/Ggw==","shasum":"e90de4a7a10d91148f205f7d46a798545a4c7fa9","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180919041321.tgz","fileCount":171,"unpackedSize":609184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJboc3cCRA9TVsSAnZWagAAjBwP/1+PLWiFJugK8+t9NXTh\nziGA2AQRGpejThyXg7IS5BXZp4ENgDQjvbibiRILhaDrDZGKE7QB6UtaoEr/\nxenCErqBsAvcUbGpWt4yS372X404ORIqTzHmerGOshAxPWsgDQpSrui8I0n/\nT+6XJhDZ6+fYb1XIz/Dhs3f0Ooz1rAdGMzhci/AaSxDMexhuEIjYMxF3KuG6\nEq9Xic19rn8wT9WnNxz3UKj92+sDO3Md7l12D70TlHPQda0muSozb54GfCgj\nFPJP9Dcel6dlp6yeLq0i28F1jMrbuD14vA1MQHOPnq38jdJ0ugIHysUB3C44\np/knhTFDdvclyvbXAI+PAPscq9OAh8Z/wHaED014Gpv78WrVosxgo9tFkZtn\nrIJc7VnIGJ/cfhg8eGSaAyN+kwxTI15KnHCzxM43JvEDXRxNQbqpvjQUSCb9\nXNYXQxMO/vZSBW8udcKlX7cu0abVQlX9rPDO4vl4yFz/Ee6EhTI12ysL+Hdy\nmZguIAw6/vVexBsmdCkgD82wjosaL5vHoX7Qnu3RyOOU6HGOfs4jxkBE+OCK\nIQfOZTkrq6o90Uc3zYlIBW54qic5m9b/j6NswpwdFYwiyvHaOajYzmNEZ/1l\n5qxi0iBaY3Xz0MMjWGe4Dvemj1Z7Mc12JGMWfL2tnS95Q244cg1prOM7J8N9\nSMrJ\r\n=CkaU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0UY95ZBdu/P6MapSF5PWVtpJkL2vGmg+93wnqoUwqTwIgcHsC6Luv0D1XcaSP1Ib1o//qgPKwo9ah8phaxn4VnBM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180919041321_1537330651914_0.09637607999524134"},"_hasShrinkwrap":false},"0.5.1-atomist-update-branch-master-1537901718532.20180925191221":{"name":"@atomist/sample-sdm","version":"0.5.1-atomist-update-branch-master-1537901718532.20180925191221","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20180924215352","@atomist/sdm-core":"1.0.0-master.20180921201255","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"1.0.0-master.20180925183752","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"20fb90c779122c90e8464535f5006f3682f22998","_id":"@atomist/sample-sdm@0.5.1-atomist-update-branch-master-1537901718532.20180925191221","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-q2WVcDzOvMgjZnowE9cM/k95wdL6vvCmUqbgvaBQgHZpjhGLf/hJJyV/GwQtO8pzbPrioZcvG1TmcCr2vV29IA==","shasum":"6fd91257e1b76357cd4d14fd8876cecc7b836ae5","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-atomist-update-branch-master-1537901718532.20180925191221.tgz","fileCount":162,"unpackedSize":601072,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqok1CRA9TVsSAnZWagAAe2EP/AufqXCB0pH7TGovwOVi\nWOxdYaoGkewSplxLLmFtuyL/8lQPtu9WPskOebQXYFOTLHvvJ0Ak/qpfljE3\nWJjoV9GPzyNZWc8FwjIauOrnwZoTKJH34LxrIswQzqrgUN17pHJeS6ivZzMM\nfxD9gqcvckLyAPfChuPDIcAJCl+Wg0gdcQ/pJvLkSE78vR0hdTDbF2aSTZZx\nvw7E9VSfQcFY76VjcR7N/HxB6YwZlfWzP196maImYiD4kBg6eKkV8zjmRHp/\nE+rSnRyNE+aPstNtNLmdn6P+HvypucABSPNvPx2Mw8Er1TEgzb8VQ8yFZlky\nB67s4msS34uqRXtfFcgI96EeP2qIMeYCNkYhUf+hF5XcuPr6CSNR4hscBm0G\nF9Ghpuf4efbGYiTLh6Or8tlvt44YPbPQGoYlJUaBwjAXX9xWIYDxXkvln10u\nzutQ0Ne0WPkPtaQ2p0kAr/66U0dLlI/NS70MxkCnZw5k9uP8ZDT6Xk2iYxh/\nGc/kIMqYPZ5xo/D789D2+DoK4eRk6JX8YIGwh0rbd/InXuVmE/G0ciesdLVi\n3ArUGFdL464Z1tAdR0xPQdx84235yCO9BUIqj9WorvBq5aa8qxIrtLVx+Mnl\nmXltyMvbZJXEMtTAdx556DXFWSuRu7jzoSLxZcEN3kn/RXLjC1WvWDLIaRvj\nDqub\r\n=hCWh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGFiCVdlzcaK9gtsLG4wNvgcEajEg5X6NKdbnPZQCKTQIhAKS6/loqjLOoqJv0fLaTHxmE6QzNePMeeCD81mW20b0B"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-atomist-update-branch-master-1537901718532.20180925191221_1537902900176_0.23879673098537002"},"_hasShrinkwrap":false},"0.5.1-master.20180925191314":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180925191314","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20180924215352","@atomist/sdm-core":"1.0.0-master.20180921201255","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"1.0.0-master.20180925183752","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"73a9eb6212f81459d09c7d9f3326416254a97001","_id":"@atomist/sample-sdm@0.5.1-master.20180925191314","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-q/rgWFLZRYnCVfG/o1U37ETLpBWA9R2eczgNYf72c+IwW36Da3hcoswnxP8tbQ68WkjbqlCYMT55AOFs7i99eA==","shasum":"f47e5246aa5cf29dab9c116553d37fa859a5c246","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180925191314.tgz","fileCount":162,"unpackedSize":602145,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqooKCRA9TVsSAnZWagAAOZkQAImQ+k/mcOrPDJCZL5IO\nmfUrNDNKF/1p+Nt1yenQvbf9nBZvKs4kHL0337Z07ZrHI6Eg+8F4PH1B6Ch5\nqban2AbHj6rsBtdLwqHVcbNsrpbEqB4wEu+1jkiprUszQKQbQCzXjFem3FED\npMZh2VCaWIx/Av9gwEemYRBnLWvUKd1nWSR1PYJN0vPx7tAhndClQ97dCCY2\n++Mryig7U1NlUQ4hKcBJYzPiKKRuZBoi+KxxkLqU7fyvNuIfnW/dz4poGJjB\nWanzY+OLKECprQqEHuRSvSoxXx+sZhPHGVxpLc5fRjN6rzHv3vGYhPKVI6Mi\n3pacdtOsdJtudgjvVHKAZyl5kI4e/Y7wFzUR36FBo26xycWnzwwLFkRldOOy\nIER/cEzPG8JF1jOBELGAwaP5Hx71YSp21adYjN+I+4OK4p2GN1GzGaIFYipy\nrFkCVEh2DkK2IJCmtlKT54crwpexa9VYzB1DoLLK3/PZtb6BUp6hZwjDdeIO\nsWZSiUYMyiBQkHcyfdysHI6DNuSe7PiPk2UbQTTvMKQpqR09jS7ogYtu/fzm\n/4w3LPYrNvzPF01hPXinkqZZszal/q5ZlXT7ZcQP2aKMl0/Dn6dm/v8Di2OR\niWR9xDQnVj3PhhZR9zJLK5Rp4tgIxNUo7daHlHQKB8FlyKgxbTOm74+Su4N7\nUqYS\r\n=EsTq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGA2qqEmVPJRrHHKBSYjKOnl4GP9iOKQlKXt14A9NeD2AiBMKSDW4gy/++6rd5J6s3knMiEok2IJedJVEpwXk7zJGw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180925191314_1537903113440_0.46659703266963715"},"_hasShrinkwrap":false},"0.5.1-master.20180926150521":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180926150521","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20180924215352","@atomist/sdm-core":"1.0.0-master.20180921201255","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"https://r.atomist.com/82773290","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"ecdb3f917a2bbdf4505f0bd0df96ec1828b91f41","_id":"@atomist/sample-sdm@0.5.1-master.20180926150521","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-9hwRWHr612hxg7KhYlxGx5/El/cOhg/fwN9/2T7zKsHy/jFGhWtGf9h1dc7xb3WxM39iKP4ueTu8/IB3NCJX/Q==","shasum":"a878ead53f0e46a5bc930120921d984082ca1cb4","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180926150521.tgz","fileCount":162,"unpackedSize":603272,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq6ErCRA9TVsSAnZWagAA9ikP+gIoyyPu3PhDNynPvP7D\nmYkw3bweud8lR9NRDZqQ1p/lBsehEBEWSzEFpc77pUf6BFIUo55FKEF70Nq+\na5M9w9V859xMDuWmw2at36dSWEYt0vJZkP6geXOqeol0j6J+zXnmn23lyyha\nL6ix934I8SXkbZp9p27FsA0j7XKF9dZpt0tk2XUzA0Wt17/Q8mCyFzEk4xb5\nOymEneEAzi/uD3MW1ugH36AzWdw76Y6U25XRGgG5qtrr4nLvyvc4dthYlNnN\nh4xWDu+Tt2GxvWW2lQPvP8fbRQAkvKL57RluDbQiAx679lHezEz/cHzHsP2y\nlUl6tbbg1eVoBYJa26aVFx16VnDsDXzJb0MiHpyNbuMfa7hv4uDAy99XhG04\nkFlVu+FKZ/bx2vfgQNXXQmA2udBUDZaoAhQtXRXFm3zOfRtZSylz50QVVUq8\n5QRFvFh5NTKVxzAOAvsrZxPrT9RrDWFKExH9Jo/e9w21O6VqZxfMOc1ber8o\nj2BAg9svfhFxn8q9r8SbfS+Ihfrxp0fR9tSGU8Bi8mzlR4VtbzK8JOj8bwrv\nkL7s3+jLkJCont9bNRiy//OmeSe4ZKPaA91e6aXcFSDIi+hnZGgco5SA1Gg+\nSD36BXggX9o1EBHnhR+pXu8TuWS4xwQOU30cZW0I2F2qRDmWsQsgYvI6J3zP\n3Il3\r\n=YFS6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCg6DNZwcY/yXGI1dutaoIDGbyZg5Y5vj9NK9tUS+ZfmwIhAOfUV24NMkZSDG0dVg13PEsSs3ckJayTJ4P/LW7aTNn1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180926150521_1537974570828_0.5782165724793931"},"_hasShrinkwrap":false},"0.5.1-master.20180926163241":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180926163241","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20180924215352","@atomist/sdm-core":"1.0.0-master.20180921201255","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"https://r.atomist.com/1236292013","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"b88c0a442fdf75e7925f91cfbf15c232d2248b84","_id":"@atomist/sample-sdm@0.5.1-master.20180926163241","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-Id805eQaSG5Q5PpOnvItaR0RRMj66abg/AlKxrnw3gigmCHspP/0rxTqGDCPYXmreU1ibPWNWItlGNlyTj4JZg==","shasum":"ad1f22178e4808e49bb6878a68461bf4a5480df2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180926163241.tgz","fileCount":162,"unpackedSize":603274,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq7WPCRA9TVsSAnZWagAAk8QQAIvBQ8wCcDnpQMbPGK8S\nz2uQK61B1itlu9TaXPKdnRdrjSAbk5HHmuh5cy+Kmt1fFZv1bpmGUzPpv61D\nBk+0JG4hbqDWFU+Cr/mTiY/puPr+Sx4gpTEdWJ0OD42Tmc2IZZOk8nndbZrt\nw+r5WV+Iua1iKtnh0pHTeDKaZFSZEwXcrUZwrC+TY79ufjmMkwCzTcVx179T\nhlkWwXGInZncxVos78pAC2zoSEdU+iQpAm0xmTHsddCyLutr/J0wZFqmcNFs\nw+9uycDMlc3IIqT+c7CwvQ93O8Hw6x37QB3pKQuNsSUBaYQG7N41OEaVIDTG\nr1DP8X4P23dKC6mukCZqEpyXRlvewoU8FmOKLSeMCzBH//GTT/WgaejCz2BZ\nwwQS70b46YHIYb06cRriZNPInKBx+V8cAC8FEBfnCyIuvQzM54Ym2n4XR5pe\n23zTjFteglMqT4zaSDEDIgkKzoiZFZ0NFX07xTlnjoGZV73T6lh3w9t1H2ct\nI1H+Oz/4tThWRIp7ZQWnFjm5U7q7fWE57HkHuJuY/KTd1SMZpCWzlTmoQYX6\nb1Zbj4q+hVr8/d6GR0HrjWBpM1E0FqFGFQVwt8NOBPaDVTu13opZYwqpaNt7\nNsp5W5R74WwFaD8Ul9WNb0CLE5Htys7OK9ZyV/vNxaIdMfNe9oZmVOoso6cL\njMMW\r\n=C/Gz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEqCZ+H0o+uUSa/CQHY1kLbQDCOm0J3IK2TkUvgZNdUUAiEA0/W8KvYsLgW2NW+3C1H+Hc4ge4suJ5gZ3Y6Lo9pKdJg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180926163241_1537979790437_0.5980595177055323"},"_hasShrinkwrap":false},"0.5.1-deploy-both.20180926164949":{"name":"@atomist/sample-sdm","version":"0.5.1-deploy-both.20180926164949","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20180926153733","@atomist/sdm-core":"^1.0.0-master.20180926144318","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"https://r.atomist.com/1236292013","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"64f370c4d4b034c95c146a923aafb478c84c1e66","_id":"@atomist/sample-sdm@0.5.1-deploy-both.20180926164949","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-LH/d4A5loRadtOzWD2/QPCeZXQx25zkn2NbZnaRcpz0gU1PrV/Mr0DwroPvGvaQTlOVr5QWWVUynU/aB2yCxkg==","shasum":"01a42fd0f21b9e3850049a0bb4524ab949d28e28","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-deploy-both.20180926164949.tgz","fileCount":162,"unpackedSize":603453,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq7k4CRA9TVsSAnZWagAAYhUP/imMBUkEi9z+G7qeqDee\ndMbgyHnePH3VYVMsr0lDD8GyWqUGY60qwBx3t5yZ6uk8+AtJcF3wNFa5EtxC\nloCiWqtLyTo69uN8nHMbVYha5DmSVB94NanahyEdFBK2aQZA7axuaijokoQM\nukQROkkPY0UvJotzGwl4dMX+7Trb08fi1agDh0FOD7dHOyGwAETr7XligPD+\nR7w3ow33w4UwHBX1Y3rfqNsaB0wgJ30MgxsfMbFVD0B4hBqlCC39g0susDFa\nsPg/leumOqLX9FZnuiaX1mXPlYx5HTXhBfTHxuPWzA6rQvJghgj53Xc9Z3Aq\nzkEck86dYn+e2le81oRjmfQHjvpXoFGvu1CWVLbn5ylldw4jtamOeU4UuiEx\nShZYyhuzq6sJ6NBAfIKOu8E3OvPUrEPo9ik2nzDxf59uevP8qUEBVKkEMrYo\nDjRtV8TcnxqtJxnd4obg91qhpNwmSzrftLaOjxV85ma7rBc0lAi0hFS7imVs\nmEGZkfZrhdykrqZhtAHwBGRRX1PjMeQ0gkSS2ory3XV5lRIZKbXlkpWMnBIC\nihfFHS08YRoy94SwAUoasdbHD5eSmLKI4ifX5j234Jw81dwWmQRwze+OXvdO\nDTOYzGd0nWIxYNseI6jQw3KzE7OGrcKa2Bjqn9xowZUX0JZIFPP5KqAsVjG8\navep\r\n=Olw8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEDMdIy4SojWdz3pOllYPmZ610OkJieKNX8pSqXVbYyqAiEAko8GXaK/ESEz2ujmJ5yATCNQI/OvnlYHBEB0fKbBC/8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-deploy-both.20180926164949_1537980727701_0.9950867236529111"},"_hasShrinkwrap":false},"0.5.1-deploy-both.20180926172324":{"name":"@atomist/sample-sdm","version":"0.5.1-deploy-both.20180926172324","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20180926153733","@atomist/sdm-core":"^1.0.0-master.20180926144318","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"1.0.0-master.20180926171317","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"ad06e508a2c222d3793f112cd2027b6cdae58bb8","_id":"@atomist/sample-sdm@0.5.1-deploy-both.20180926172324","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-RzEof6O1Q0qYng7N1mlZf0gvxHOJRFxDESxwe+OAYeOls4c2pEsj8qjR1+3RHrkkRfRXX2tbnBefbDEO78RZhw==","shasum":"623036a8cc634e923cc7f21b190da96168e2cd98","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-deploy-both.20180926172324.tgz","fileCount":162,"unpackedSize":603448,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq8EQCRA9TVsSAnZWagAA4vkP/0qqWfxppCQLh/iwIGNC\n4zFRvotWCy76qJFe3gu6YLTgIjrFKnSpJkZxX6ZXPP+c87aw+mWeEwYyI5OB\nTDrmYSCYDsMCQea+KVQOo8kDpT2bKaFbt4uKgcKgaVGRVgsESECURfEqguei\nXRlNGZjSAzsj0pXqoeAieWpyt46CnGMJEVjqaBOF+yNtVeDRB+rdNTPuSoIP\n9Sf/nMCDURn1E07nEitUQnxJMz2U+CTXi2gt8F0RDWdp8HoONedLDuXo9wKw\nyODJLjdRsgflrq8xzOLfHNJectYMNn5LehYM/BFmlnoB1iCqiGrhwX80PmTJ\nZv8cGZ0XoOkkto+bSOd0ksV1MHS4z3SYAU65Ndy23ZvAcF/M42Dq8wFt25tH\nisXry6oOyOwqVmcUzQTJg8WuDMYGSc0zsvcT1seTz70EINWoJYvnvu6NdOMt\nYn+uW6+YijOqOpyVXVyyO9aTtxLHsSVAkrgza4x+A3x7G14qNoV75rxl1BBE\n4pAhjKlx1suwN+J7NT+WnmRimdp0D8r6bUPkvf9pwObIMnmGUXSfVuZeeklY\n2W/2mdee1I+D+XoRps+EF/RdHpVrKLgOvEPVcyfSugr+HLD5ZVLj/m5kOYpl\nOioGcmwOcfENJkgx+aHFT/UbohB8LQwreoOINszzwFosnAokanc0J9n/L547\n7Bd3\r\n=bHvi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDnhvkXCJtwZZg4klUIIxxdZAR29AEeYdpdQEn6LDVbgIhALPrj9Nu6h/J2lDJ2c6JpTdoL+PQm/S8amb8Gp3OUTmT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-deploy-both.20180926172324_1537982735408_0.7230744572838514"},"_hasShrinkwrap":false},"0.5.1-master.20180926173442":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180926173442","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20180926153733","@atomist/sdm-core":"^1.0.0-master.20180926144318","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"1.0.0-master.20180926171317","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"12df2eb99d51c602a49e302fcca853047edcfcf7","_id":"@atomist/sample-sdm@0.5.1-master.20180926173442","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-8Hw7+x7zQu2PXLJcLrfjTYjpZX+wxg7L+r6i9Ny1dxRdHHM7mfPo0T9mkKBtC/AhxCcQLUdjkHpINN8IofzhOw==","shasum":"97b3a28b13feb0dc3a0b28d76df10c82f341717e","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180926173442.tgz","fileCount":162,"unpackedSize":603438,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq8QtCRA9TVsSAnZWagAA5GwP/ioPBg+IzKd2X5eeyP8n\nCgiozYYvBJOKwohO8ifi+CWDhy4T0LLVO0ZJslZHwD60coVlEnMitAGFR5pX\nhJHblIj8s9BNk3T+bdHj0nGxHMUVxng624V+TkQ1aE/toBJLITTwwIS+2BRD\n2LIE744j6BSyciYhi1yFLTdc3j1uJ+6o3rxcW7u4OjcB/j9FbZNjUmSQcr85\noizFMKqdnl37eG2fnuOk27Ylvg+I6oTXqTBpLp7cVOVQNBeUA9EAgx0oz1s6\n9JKQsvg9OVtewfrkPhwu62+VOrXHwJcyF3IZijoA1dxn01ctwQa9HVf5xcHs\nqTbwZ9qp4I1oTS//oBtoomkH9k4kFPOgjDQCicaKvFCh6ug3CqJjzbhabCC0\nsFpyjLBc7LYbWt1KwgxD2glwZrzgMk3E6/V4j1wlxen2QGRsyErpDpEGcztB\naEITVHxFEl7sIGztfv2EUo9D3LxR9Anq+plR1uSERRgzlD1oDd5BqxGwt6VR\nIYPHSU05cAPkVZf6eGGY4YhGGH5uYAOtrVvuur40Xvuf9ZlsHW4QDBZVrp6f\norn9+f2EFySi+VIt8JShKzGyNLBTItkLmNseKR2Fc3kOfn3guw8Q1+jOBuIN\nk2+czcYOP3Qh6zvJQZMr9QHxzesljbj813hnCz6H+YcSyVisltmKJ9OGg4A4\nPRFV\r\n=+iAu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFf2X0RaoqPDQ6+MtDHsZdYa7m01r6vXPRMW+4UjQ9zJAiEAhzrKYSrDJtLDFgcn6MIq3iKcsT9RnEPivSuoXYBrZjw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180926173442_1537983533111_0.9303364052486258"},"_hasShrinkwrap":false},"0.5.1-master.20180926184429":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20180926184429","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20180926153733","@atomist/sdm-core":"^1.0.0-master.20180926144318","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"1.0.0-master.20180916165427","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"https://r.atomist.com/923728343","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"22a70b7fe1daf0fc28fd8548d25dd66920d90f2c","_id":"@atomist/sample-sdm@0.5.1-master.20180926184429","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-BRpexvE4z4cqU6fa2f1tfagnSyeJaDDZ5FSkdtM07jkujBKBxyPPoK+AKD651nSJx/CRszNWe/MpWgpOccmR8g==","shasum":"141d3337340f2c8d2e38f22f9104946a808365e4","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20180926184429.tgz","fileCount":162,"unpackedSize":603842,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq9TWCRA9TVsSAnZWagAA/vYP/3BSzllJn6yNxNfaJWFx\nZsN38rtLYFACVk0f9KQ0OhJMfzKBaliRONrjaU4VOMrzZy7QkpcKt7aDSZ51\nR+xuymSOx51S92FJJOthIaEluSp9g9bkcJEy2jfPTIUw1WoPy2b+2AEOiQ/y\n5m6tpntsqwRRpkBKus1KHBLEkIJY2aY4ZfE2rUZsFIyu7bgWGp9CGVYZ3EDl\nZzYOhrOVepCqd+CsgzhycX+Yq6x4HTXffHAv85dYnIxYoF1tKDieEnRjD5ji\n+pi7Ap/pcMZK3DKQXkCDUzxl1veEuI6fmViV2Za5c0DOzH7Om5efm8dWzQhH\nwcYOyUozoKn4vzJSnhrh7T7+5Jv2rd8rMakHMCjk920j/gD98uR++H4xxgVO\nGl4kI1BG3XrE3W7uL/EWZOWnjkupKPgAOz7ska/lLiSz0+tZrnWMYdwOFKSC\nIs5wJ5CaTig6KFUx5B7S9e0gmX4bEaQpfLbY8FYv5KL+p67crc9066ZaxtkR\n3RRdqwQDELmg59+uH3uBfDphivOV3Kz33iIEYMS7ot4hBlKxbQWWBEAtROrJ\nPHRWKUbTXj1cGek/YARjFxC6uKLJKUJrVkhE9ttj/GPTy+UfJDMuQLyfxnMM\n1vQN+M5ItSPNLYnVGyWC1TulsKogfIdBnvjzNrfKksx4PGyacrgV7Tc4YtJY\nT6ng\r\n=xFEt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCou+P6FACdD4Q91hT5jtYDB4pyl+83eAinQ+lcRo3nawIhAPfqc9hBrhdLgjYsXqKaD0i0/B3FrwCRwVoZvSZAqJFN"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20180926184429_1537987797491_0.11762663770483894"},"_hasShrinkwrap":false},"0.5.1-updates.20181003141234":{"name":"@atomist/sample-sdm","version":"0.5.1-updates.20181003141234","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20181001142547","@atomist/sdm-core":"^1.0.0-master.20180930200405","@atomist/sdm-pack-build":"^1.0.0-master.20181001213708","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20180921145253","@atomist/sdm-pack-node":"https://r.atomist.com/676890220","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"^1.0.0-master.20181001200732","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"11ed504ff44b1bf9e44999d3f487a6865bcc41cb","_id":"@atomist/sample-sdm@0.5.1-updates.20181003141234","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-H681bUacyMxbbdDnuiXnn1xVvZldOTa8SMw3EsCRHTyORmu8UGN+vxwoVojciL2f60Tyn9yVdbR+Y5NAVeAUcw==","shasum":"38f3d5d1fea4bf58d78421988f0aa1988c0cc4fc","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-updates.20181003141234.tgz","fileCount":156,"unpackedSize":595371,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbtM7lCRA9TVsSAnZWagAAa8YQAJJPzYXD45vcirfxc3H9\n0lvgdAZC0OmcCsB+e/zMxOxlF851uMBPaEQzE1fog81N6aPK4YBdcVCoLPfm\na/DltW6qOPOOpr0jdJUNCD43DjRDnEm3Z3gUlxR1WKmJbcD7XiACZEnPRaOY\nfhVlcheCt79V+rXsWyB5wTy1qQ1z7H7/PG/Wf2K/CngCF4CKp+hmc2Z/m/Xx\ndgeQNrwCnbT+DEU4JpgI0Dz7eGSQ+VSJC2CCssPn5YajS/w6vW6AD+rIpX8X\np2q/nxXAVHwkkn/fEIVk9Omap33Jwj9GXG9Nk0s33Ve/Q6+gfqIbvhJl09LA\nkwLJkIpyFP3Ze4mvBQ01UOFqU2wIkoiqZJHUQUKh/rTKbdHFmPxbv4/WgPDP\noTz/lFgfpitNo9vn126amcmdusGmZ66rxyFpLy5QqRw6TD2y/RuP2QN9GLD6\n3hKe42UQbUdRMgtzG7J11Yj5ssXRTXwhOsSDDPMWCHuA7bljFtCqfh/mY8sc\nc8uXQWELsdwMstvWQBkNwokziRl/0atRQiBJ1HB7PF6/TW6g2ZksUmbSei9i\nn3PwNW9IOpOeV7P0hoiL4TCf5M4EggkzY9zAou5vZIWcAjiYSr5YJaottsxm\nmkw42DX4gMQ20FHe8Dev8fOoA+qHhPYGsEoyGg6oVqrXcRl9ISlua2k2eBnb\nKMyJ\r\n=l6vx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaGsVVVsR0fkq2o72WGSwNam7JLjSoxLO+nRWAT00rgwIhAN0EdUx+CPJmOp7qx6Ld67T8ygk+xph/oRu2G0W77Jtc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-updates.20181003141234_1538576101100_0.5337380903699036"},"_hasShrinkwrap":false},"0.5.1-updates.20181003154209":{"name":"@atomist/sample-sdm","version":"0.5.1-updates.20181003154209","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20181001142547","@atomist/sdm-core":"^1.0.0-master.20180930200405","@atomist/sdm-pack-build":"^1.0.0-master.20181001213708","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20181003150738","@atomist/sdm-pack-node":"https://r.atomist.com/676890220","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"^1.0.0-master.20181001200732","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"ba90ecf4e37ff98f8bdf7647dc114dbdf94c91fe","_id":"@atomist/sample-sdm@0.5.1-updates.20181003154209","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-HrwGe7aGug77NJ7xfZZ6uu/VmYe+cjI3jDOZD90Mb1htLQHjhh+PA3cxMxD4KtatNQCi2QAGdEvv8JzXKJQBmw==","shasum":"b4f91c9e515758252d889443033fcf4dbdb449b8","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-updates.20181003154209.tgz","fileCount":156,"unpackedSize":596114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbtOPTCRA9TVsSAnZWagAA/xQQAJxfhuqeuUcnOcYEIa42\nvI2tolkT3mhVV2ec0+E+LMYLfvbAMoVsRMyaCVxLfya7ueDEnVLo3zvOZ9MH\n3HYc350cjpkY0BAEMSKPjxiGd1CidzV6stB+OR+sI0Bleif9jSu1xxUVfETA\nJR7jD9TEa7J0+Z4HaBvGSPMt1htoxiVLiVDIaI/EoP+txYGLAta1Lg1NtcRu\np4M2MbeIwKv7PMnnfMdKeW795R6ysm3axobUaisDrhBXCka5aCs7c6xCqf1L\nSgFMie2LFtHBKnd47ajsQlcJmPkpC9uri8ipiHxNShZCFu0law5p6kaCt10i\ngxHWC+ei2f1jrwuyEUjgnQvIDh7tAWmKBlxhG0REEnuqv5Ovo/w6lIQzkzSf\n4IZm8+l9ItFJZfNOJF8dw0VqqtmocYGjZOv8u2PB/uAHWN5C5bmEPFE76DJd\nCb5/uvMoNWy+iZI7eMA5tx9k74FpGLgryXPwbqKGEyYqtxOG0Dh3VoUoZoeM\nXUGJ5sAVyHhGSYhlx16UW+8+9kUAopEVg29M6f7BYN9bk09RTN4dwkaZC9sn\nPwPuJJ6djpzvTPB5m85y6bZHet18ugGzbzAA26YkmAmx79BCnz9/9kDzUfTy\nq6ajg7Zm347USWYPQ+GRsqRRvOkLwuvZ9FifRaogh6ni8rAhn06tackcCn6F\nQZjm\r\n=7iTo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHPyOGFXO6cJjTUw7wJCvAtsB8gLQ3T/Jm78j/s3iXv6AiEAuE1yjcSqy2lCSzwIf50qHhReJeaY07gc0ZFyp52B5VA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-updates.20181003154209_1538581458838_0.32899551958693074"},"_hasShrinkwrap":false},"0.5.1-master.20181003172619":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20181003172619","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"^1.0.0-master.20181001142547","@atomist/sdm-core":"^1.0.0-master.20180930200405","@atomist/sdm-pack-build":"^1.0.0-master.20181001213708","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20181003150738","@atomist/sdm-pack-node":"https://r.atomist.com/676890220","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"^1.0.0-master.20181001200732","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"ea9faebad5f34857b521b4660e3878fd420dc029","_id":"@atomist/sample-sdm@0.5.1-master.20181003172619","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-WNch7a/bxfWzkFnNxYmM77ZVEGiNyclu4AeeUJ+xtI0LAx7Sqnf6cowjUKBza88eJEg7UnoK1Q7l/0n8cvzLUA==","shasum":"b75ab2bb04369118e335afec3fef38983eb5dba9","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20181003172619.tgz","fileCount":156,"unpackedSize":458639,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbtP0QCRA9TVsSAnZWagAACuQP/1zQVp922St+mnLehEOw\nPCWpTT0PwJXYf/v30FB9G00uyvI/UyrOisqWYhfrf6AxjADkTWG/9v2Ccx4S\nais+yPIlochL8zPZydLNZGcB0NzaJv4yL2OIV5emR2jxGsi7U2UHoe6+8hWz\nKhvACFyvpSBPJewOFRe2U4lUIna9z12NKACDmaQK/IAPRGVUVeHtCamkhFUI\nVTVz6MlsPPgLZzpxbpgafnftrGU7rw5j+FVHkQp/ldms404F0b31EU0XrvYK\nnpGVzzea8+OwecA1eKn2+Hm2IcpdlAXsl4STOZqHKDTwuQ9cLgFS98jqpIwk\nBmUbNkKul3PJTKWH7XCAYIR0sA/SK54wx8AQEobATUnKYyZQAUDNrfknM7vK\nFWTWIzmPOdCuG3h6D0dSe2PZyq1qhE0LwyVbYrgEOhJzUO7npwuAEY+TP5+0\nVLf4z8qnMPqiwMtkAXk3KK5eGnFsaQhy8EWqvy9ER/eHBhExA4G7vB8aKc9m\nb3rpbR1Skw1nuiKX3DeNYvsjxKarHkaD1U1ts9N5sexcyBH67ucyddDMBmTj\nx1gH/JyV8OzVgL4U+tqSY1zdYcN/CNQK2u8YCUc1gVZy637OeTCUNC0Xz2Fa\njIs1TUZezCy0Ogm2GhPIy5BQT7cBWJMoMDbHEgpGGFnkZmy1uszu3P6qSXwM\nWkHP\r\n=qU77\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeMJ66b5AERHKkoe6kMR48O0SKjYRFz0c0btqSAdJswQIgfJdJaFs+e6f05BMIshUyWtouWTDKbDS6WNZui0R3bW0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20181003172619_1538587919959_0.04800644840150303"},"_hasShrinkwrap":false},"0.5.1-master.20181003222050":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20181003222050","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20181003213948","@atomist/sdm-core":"1.0.0-master.20181002153059","@atomist/sdm-pack-build":"^1.0.0-master.20181001213708","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20181003150738","@atomist/sdm-pack-node":"1.0.0-master.20181001165622","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"^1.0.0-master.20181001200732","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"a3fbdc3cd8ca9da55e6e27a9d29a0480cb869a06","_id":"@atomist/sample-sdm@0.5.1-master.20181003222050","_npmVersion":"6.4.1","_nodeVersion":"9.11.2","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-ffFyR2eftt2CwqdCdGPpBxCIE3/W7hTbumnH4yvtJwMmRyMwkRoy0PtkjFtRHTORswYrIqCcfBt9rPoCJ3n5tw==","shasum":"4bce5aa3549702ecfc32dae609559a69407e25e4","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20181003222050.tgz","fileCount":156,"unpackedSize":458721,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbtUF6CRA9TVsSAnZWagAAuv0P/17qXLXQ3nlGIBNAOY2j\nqZSCz+qF8HMPWNPWIMRSZP2jpkOKdrMlYqgDUmq78y3juy9K80sl8GNdPIH9\nY0Gow341k0wDHzZWviVpoBujC3w8SKjLA2mVHdgWF1ZshXHhAnZb6ytChfoj\nGKk6gO4oah/0YKNV9tIxNBSLVU0zTZb77lSp9WOrIdyJIkxn+Ygv4aORQaFi\nqwas3MaKfdF/BU6Bu+5mdQ4QYaL4JMAUJFoxgorHY2NUFQQJV6GydQRG0d7F\nu4ge0Dno5zguBu/VZ51f7JWww4FIWXL2EuM+2mA7zBivSWB0btWJh1iUGmqP\nowTPBxtYwS206yxZvuWXrzM9ufo6w7tHF2bAAb2rWpzCZF4KlNKXu+JEQXYW\nHyzqdQtwthv4LONoLTsu9YZ9JWACaRtDo1qu+lUinxe8dtckWyDTxCrvclut\nvH/TZ5fWpOQyxRP1uOYhVY8VnInKnnDbCKAPfguj84rqGvXzq2zDpks6DPlM\nMtBVRm3Zvxq02eN1FjmvBqjNFK06NhFR4FucjS8Xc5AQ1LsVfP4dWFrNI4kH\nNuCDIAMLvXpAwZBmswSvXSkIHKWAJ6enLU2LCYu9OWq/lcnluJYg+OmC7Jhx\nI7iG5oDcF+ZyeM7lyAZpo2+gyjNcv0ZIqqMCQI8XMg2tffgKWklw4m9EWvx/\nJCmN\r\n=i/qS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGjDhkPMQ5+/b1La+dctFbirv07xlosfZiLhBq/O/mVZAiEAv68a/5wuuOu6zFf0cZgAWqIaQCu3kTcqy72zJzVUL+s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20181003222050_1538605433998_0.04557029719733863"},"_hasShrinkwrap":false},"0.5.1-riff.20181018004805":{"name":"@atomist/sample-sdm","version":"0.5.1-riff.20181018004805","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20181003213948","@atomist/sdm-core":"1.0.0-master.20181002153059","@atomist/sdm-pack-build":"^1.0.0-master.20181001213708","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20181003150738","@atomist/sdm-pack-node":"1.0.0-master.20181001165622","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"^1.0.0-master.20181001200732","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"981ee33a35ca95192b2f7b86a0a2f1c25c2eccf8","_id":"@atomist/sample-sdm@0.5.1-riff.20181018004805","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-RutIc/vLJOAeNtYDgqQagR97ZA7XGIxCsPHh6QWQzyf5a7xG955JIpui4We2zp68/9Ti7G3/JWwzbjTvP891mA==","shasum":"36fe1e50c9cc77f1019aaa9e531789745a9209f0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-riff.20181018004805.tgz","fileCount":159,"unpackedSize":463581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbx9ihCRA9TVsSAnZWagAAfnQP/3hNG9u0MSYFtK1Dlgyx\nWOcyJEuV4X17sf7c/RJU/LaHLKGjySXIGwA4LQpacXdFsExn3XQ+WtxzmfCI\nywTq7/ZGzv7jxTsWWrWvqCm3fg3MHd4NcmMcl/+3jA5eTx+NakhvGDf0w3kB\nsVL3aqq56WOXWoqVNrxv3jC+84XZOS3JMewe6BqT9yz5yKmhL1uXexe5NyC+\nO3TyBp7evoY5y+5wrEfTf1ICuXiIEY1bKig0TD+HK9xZJn2kpxO0gzbIpygr\nSC8SWSUA3D5xtBzyqy4aWWDrUEC8WmC0S5bxhYqnQ7Zoqaha+R5JElTeYIll\nI1JUFc0NoO4NrYuyKHzovmTeX4PKjJqG318rLg2Xx1Cc8yx/FpjJrO/wrDjF\nKtr99OYeAE6UgBHN2El6X9+Z9jgbodmExFzTzqpde1d2K/gU+eWS87j06VbU\nO3YAXDQVZ99ZeQf1PQDcCyOFVDvPV+BU34dkQvGQcoB6gaNT/lbr3LtG0tIu\n/hclr7BiddVwlm6hIRdR2cl9pLcsS+L09W3h3Vqy0t+30b08MNi0u4l4t0xU\npFV1dIWiocnrOWZqMYNGQMrIBTsMSdFLf0GBifwI3gWVHAyjPRrLNHiOHCe4\noTl1Bmb95p1Nk8r1Lo/OKEStvO2LsvizOFy4NaX2cxrHWP8IAH1Va+hWS/pO\nX0pn\r\n=76YR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlO7fmJogHOsUP7k2v6yKArRc6RjyzlIXQrcGANS9k0QIhAIvOpyUHzmZjvf7P+r7MgtKBeBdliH+PTiUJrdW2DCPJ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-riff.20181018004805_1539823776185_0.06518050274486376"},"_hasShrinkwrap":false},"0.5.1-riff.20181018035031":{"name":"@atomist/sample-sdm","version":"0.5.1-riff.20181018035031","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"1.0.0-master.20180925122935","@atomist/automation-client-ext-dashboard":"1.0.0-master.20180916133155","@atomist/automation-client-ext-eventlog":"1.0.0-master.20180916133303","@atomist/microgrammar":"1.0.0-master.20180916080140","@atomist/sdm":"1.0.0-master.20181003213948","@atomist/sdm-core":"1.0.0-master.20181002153059","@atomist/sdm-pack-build":"^1.0.0-master.20181001213708","@atomist/sdm-pack-checkstyle":"1.0.0-master.20180916182154","@atomist/sdm-pack-cloudfoundry":"1.0.0-master.20181003150738","@atomist/sdm-pack-node":"1.0.0-master.20181001165622","@atomist/sdm-pack-sloc":"1.0.0-master.20180924171241","@atomist/sdm-pack-sonarqube":"1.0.0-master.20180916182022","@atomist/sdm-pack-spring":"^1.0.0-master.20181001200732","@atomist/slack-messages":"1.0.1-master.20180830190736","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"1.0.0-master.20180923142034","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix fmt:gql","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"2dd0fc5d0d80512d27bfee9895021c0039654b41","_id":"@atomist/sample-sdm@0.5.1-riff.20181018035031","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-AERmv/mL9S8Szj82xfw3JO2jrBYMRcZNgMnSMv5WzIgGE2iAiOmnkonlIuGxYqRCj2iHoHeKtsIHjX2IBBvefw==","shasum":"2220c5aa48669fdbf403f9e97d46f92b71f74b18","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-riff.20181018035031.tgz","fileCount":159,"unpackedSize":464917,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbyANcCRA9TVsSAnZWagAAmqoP/2zAcl8n+aqGYoCWnMuT\n/KYgI4mrVzSNCdWu7tScK1wOOhtV2zBtzMfCh4HSYLBnrWwCXb6eDiuf3oE3\n8jczPyertUof5FUqlQg4h6QwGbvPGVSfLD+bcg1ttbVO8wYL1nn8pQHEvZr3\nlntd5hvanEU7NZN5vxw9JX+jHXg5qnf4Q+rc3nLSuFEAkeSLNJp0MhJFqgqL\nW7ZiWrSTEq/4MBIfgjVhvcX6bKze+rEHGMGnr14A1814327cnfs+7WDzDEBx\n5tauSI2m/ix/wGcJwPUzhKamfi0jS345aQe+4la66TQSrcVHzpP0jfq6SziK\nIb7CTjdoe0bFhtgOvzo4cnNWJrghnGy4fGWub9o2nybgDXIPpaAbGklImGsk\nJslDV7jiyzBpBYFgziie+oJrHeZc0EF91nFipgDVlnAC9WojdiEczC+QaGNS\npBUKq228bvHV0G/vNDnS1Ek7ULMB7mwrcznKYE1gCaiD1KG3Vo3GmMWXTDGq\nByo7Vi6z5Xwrhqppi9CZIozFfCs2BFJkGIByjDzbkfMLswtTT3T8JutgCQSi\nRZCo3MMJEj1QXyE5u3oDpJ0IQ34NnNvACl+VYsgRucrwXZRSMRnaDPz6q7NN\n8wkzLy2d6ucuxO///xEa+B971mnb2kVKvnLj7u+Lv3JGa1w4apvRHN3WLSWM\ni2tg\r\n=YYha\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvUsn7RsWnQYYuEebA+IrvpHsrVx9ZvNhJ+0Euf9JBBgIgOfg+DTFssTIrlSrYsdMGNNuRSPoJSrTNQ2H+fznD1tY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-riff.20181018035031_1539834715699_0.22200613571600258"},"_hasShrinkwrap":false},"0.5.1-atomist-update-latest-1540938130032.20181101043939":{"name":"@atomist/sample-sdm","version":"0.5.1-atomist-update-latest-1540938130032.20181101043939","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"^1.0.0-RC.2","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"eb6284eb9548952ab0fd444cc48b81f11a586c50","_id":"@atomist/sample-sdm@0.5.1-atomist-update-latest-1540938130032.20181101043939","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-h/PL2j9P4nHbZDT7faJP/x9PyelTiZfs1bkCvnX/gZ5giCMuZxBrtz0cE9PvX8hmkL+ke6rFARYIshbQWJuJ6w==","shasum":"cf58cbfe74fad986c4b433b24a17d91e761c2284","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-atomist-update-latest-1540938130032.20181101043939.tgz","fileCount":135,"unpackedSize":421065,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2oPYCRA9TVsSAnZWagAAJfIP/2EjvlHo4OAwMHqKuVB4\ne20lB0Sl3TTWTYEVg8hNnJKFYj3MBKNaV9X3DJNssaCdU3hTIRmSMapdhiHh\nbL0US047I/rumjUT99kCgBfuaeo+wky/WPc9KZV5N0tKOMDgFyD7L5nx2Ovd\ng7B/htDyqW/vaPk0tez+zmyaH/Qr1ViKTWQEw7YroIAEe0V6D5Wgd5dzQQvp\n5KNZu0Uot4/YQFq872Wz9ZhKQg3GlWqkhu1EH8LMODuAvOgxcv/6oS16JJDJ\n1z8u0Qn+IPVDfila9AZmj+uu7HUxv7cBwlb+0AOdjAe861QSFV9RUZfOrF5z\nIR8b5P5I64ASFlyrpFZJgeh0e2h24zUWa9qu0hCxSDoXfbE0J+wfDhLFFccg\n/L95Vv8hwPod0U6ljMVz4C/lswmO+COf8d8DC3vG3Q41IZ8OjCpc73yam1JB\n1M1bXkb0hOrg2DXCSwuel2raPS9z0vSijaQ3TEWHtcFnO1d9gHbaGKUieNsn\nVu8AffgM1ckRjRsubGrcdwM9pUPF2FOv3V3LwU7BzlQeXKsnLuQ/vaUHk0TD\n5gcdfX8Kk7p8fDUweM+52WMzfZ6jA/h98RaO2glRMDNxkq0RCy8hb0pR2RPo\nWvZPcyS2olFxAYFZr1q4OUHAspUF270Z6JUqYCfHsjZjK+qIAMEz7TEy4ENC\nqska\r\n=Iiql\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHxiU/go1/iX83ogk7KAEViM1vyX9WiGifaxBtRIFmrBAiEAtwjXZPdhTuLwWHm++zZ11afiuhx62/vGydHXSp2NFd0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-atomist-update-latest-1540938130032.20181101043939_1541047256005_0.3611334570851088"},"_hasShrinkwrap":false},"0.5.1-master.20181101044648":{"name":"@atomist/sample-sdm","version":"0.5.1-master.20181101044648","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"^1.0.0-RC.2","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"594ec61c8e0f9ca274bac651411d7667f9b49f43","_id":"@atomist/sample-sdm@0.5.1-master.20181101044648","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-TBaVM8A41pCHT8Y+4S76tibzfPTpeIfIaD06Rm5sTjYvmY6HLgtMQnYaPMOKA1iSKJ/BCS+e3MLxV3kd0f/9Sg==","shasum":"2f29688e63c680f55afc91cedba55c06bdb7dcc3","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-master.20181101044648.tgz","fileCount":135,"unpackedSize":556575,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2oYfCRA9TVsSAnZWagAAoRgP/1CI1MZ/lIq9kjsK0GCF\nm9OTOxaUs0g7mdhXMpLB6w3AhDqJbtNCYGacvDyvHj48ql7F2PfsE/0sKtGF\nLZOCTULYsUsK6ksGLwAxTJq+EO3SiuODK+yXz/taxT0YPwDPGoUpkMaKlNEI\nnPtg6KJywaFh83jg7fEZNBARgZjPnrSggQWthsk4Fb8ivWdkFskNxZOJh/4Q\n20VEbYc0ejchISguAaIRciLwZ7X2rKMsu3MgJGitRsSUAYSzTqC036gzbsmA\nUyQMH3bzcBeicip5ZMRzyfMs6DltbmGYauHJFcC+BvmPEFhWE3v77fvKXMyB\n39DuImaKeQ84IA6sj5wCwlUcnojrUsl2+Bcc4cSyGQzmo9vSqDKMJi4ox4d6\nRb616v0JqodGbJ9elc38noMlzxiqpEgEeQa+Cdz/LK2Ls6BffZrPOtZO5DrX\nSQPQGc6UtbFJsNLYzR5JDDgEFx3wKdhDi7wqDJ73t02ia7NsfMVVniSxtGH/\n/uYCClQTmXIvoylEbdN+VAoestNMHYSZ6wd0JyxSmgDON57xSAQL/yqVOmrr\n0ChnqlA4bX/SAU8w+Z5A9A015E1R7T/e/xmOHxk9xA6jKYb/8NTNPK3Uru6/\n87XmcbK/kQQ8LIGj9+Qf1iWPwNef57Mj6DpRR9eisDiBk80s4KlOUyeNtwKw\natLk\r\n=0WcK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDIU+LetuBFriyIhvO/EciFDFPGvQVAWAXqxVVpY734vAiEAhdiAdYyqU8YpRDqlL2nPq+I4d4GjAlbxW2HvYQD6R9Q="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-master.20181101044648_1541047838297_0.8904075250329093"},"_hasShrinkwrap":false},"0.5.1-learn.20181101111245":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181101111245","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"^1.0.0-RC.2","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"b24a9217fe93f499ccc7149f5ae27b05b3cc3908","_id":"@atomist/sample-sdm@0.5.1-learn.20181101111245","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-hiag8y3wirZ6L05JGWL1MV5e8eLT6Z1pyVNRC6qQg4rSVzNs4WXHF5tHi8TzOi5Ex6G+WlkqPtoWgrpE+jDAsQ==","shasum":"10770740524ffab2de99ca4214aa326f69f8e52a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181101111245.tgz","fileCount":177,"unpackedSize":613247,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2t/7CRA9TVsSAnZWagAARYgP/AvQr5DlfuK2mSNpp3Y1\nvr24m+iUVrghqC1m2LwjlSYBizEp8cKBA5JY0KQbsD0pV6Js79mXyIAvPtB2\nknwNAOOFfRoPxgHieNWbxA0Jku31PVz0W8QFaM98s8VQqGMZ19ivTBKs/0Vq\nX/Mal94iLaj4Uielvf9cUiQm/MKiD0G0MCk0nKbH/9sflvpIyiyhRbs80XhI\ncJLY8qssk1m/Zs0N+WqgnZj8acGq30Ei8qMjlB20JEw5upKA7o4Hk82rnT05\ngKBeB415kNrQrGJ4+JRQzqThYuVpL0waoR3t/uoN/LU8DMpAWmyvmYte+oO0\nhyCMPIvkzLcDfXifyc8pb7rl0U1Q97kmxmtPGkoSSF3+E/tnX43GhLbbg9Tt\nZbiEhTPllPOKE+bt328dMvVr+Xr896lY09PKn4yhM8LR93keTMt29WG3beBA\nxMUE02bkYpBv54xgnDNPlxoFBNCiTCKeW08nm8fKwX+9cO4asuEmk4tat4hE\nE9krZELS3xceLwuI1uTvbm05ZVtB4DvdXUgCs6UTTF8Rf0ip/4JG6ZXRruXM\nFA/T+fpDKX87dSCQ9yrqXT8Qk6fAKNvvz6K7VMnEqL08SRq9rw7TBPUE32r6\n7ZH+UvWnfnPIMYxEVBwDHOHu6vVDa5jbm+ZbbSPzCE6ARfzXhgpgqIL4WTJ4\nbmKV\r\n=mzJ6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAmWUqHJnNfjDfvkv4EZD3XWZn1sILy6LnLYkCakgxBlAiEA1PEmARi0Qj8js7LwRhVNP2EO4k3f7mj8bPlmAMFe8FE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181101111245_1541070842705_0.9171526965179977"},"_hasShrinkwrap":false},"0.5.1-learn.20181101111634":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181101111634","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"^1.0.0-RC.2","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"0101e2a3dfdb205a5236fa2798de3a961b809094","_id":"@atomist/sample-sdm@0.5.1-learn.20181101111634","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-SqyrKOgrby8HK8XtRG7/eL/KbGzx5De37VvLMndPlpv2ewzoP8pfmyuensvAzNwInCGD8R1Pj1ZNhuxPyg1vOA==","shasum":"c92618ed370df0ca9a57cb1b648e659dfb72a03d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181101111634.tgz","fileCount":177,"unpackedSize":613475,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2uDcCRA9TVsSAnZWagAAu+kP/iwfhVtLXRcnp32LrfWs\n3EnGb/rlxzHI8U6FCUSgUQ7J5/dsS37/UdcFQxcE51HFVm3/J9a9vaIJDLYU\nnhd024Jd7nymS32lHbgaWB21SVO+SidbiS1DirPQn/piYVpHLBa32bee4wRC\noZQ7AAhn/+1SvH3bd6gx1iDFCUJ0YIqhNHD5FJV1OY/W9zsajFudFKPti9Id\njqT8j2cQl9mLLpn0ePsMODe6Wtw8AGDPSpW/hsn6MBH6rwOZNojfWPwaOF+s\nS27nqmm9hLMIsOrHT86/bl+NfDaMhBt+O5lsF9fWY8lji3a9YMdppZ+Fc4Zq\nowHRyn6/IPSNTtTtPqaXNEo4QTXMpIyKTD6Lwx565nDxOZKHQ+POU+Zww3OR\nah0YSYb7hgd0KaQOq69b4AcxSLH9VLV8P9bjiCLVkY3mTZEGm484l/wceeMA\ncQZTebRzGBDLXtyizNOFDNz1qlgGbFsnqjVnklYjon1E3QcUxXw8Ly/JnG+Z\nQtnLAGxIaxV3AsM4WErwqfBzewybSg9OkXZEnMOBJgZmWRVmhi8++ysDO748\nvIj79zXZz2wCRyowjvJ5dOENPI1xjdLfRNcQL2WOdMPqv6BKhr2uoyaRMMTP\nByme/l8paTQP2m1GT89ebGjJ8BckESIRsgYV/K5Ua8cz+PDEVozOZB0oyc2W\nt+9r\r\n=KPO4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBVxZmyp2mlXOgNEcB/CG70nAIF4gdPb/q+u8IhELHqbAiEAkcLTWVElMitiH81pYhk7m6AKS2VeMxFxdet7cXcLdlQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181101111634_1541071067511_0.47569867184879033"},"_hasShrinkwrap":false},"0.5.1-learn.20181102033812":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181102033812","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"3fdaf7a3402aabaa5fc9d4f0767389a337eee9cd","_id":"@atomist/sample-sdm@0.5.1-learn.20181102033812","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-e/Wa3QpHa16UK4z2Y84eVLEZpNdUg32EudO/fzJh/6bF5nsGupAGNtNLMmfALKRmhxWjziml+Ubn38F/Htr0SQ==","shasum":"09a863a4f241333ba053358a206d532129b7ebe0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181102033812.tgz","fileCount":180,"unpackedSize":617042,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb28buCRA9TVsSAnZWagAAtGMP/R0FUjtt4ul3vVFqE4gL\nNhttX4Mb/mo1bUeK8fQFgQ2arJD8kQTPRzZDeTWXNwewmzlEB672AkGeSnRp\nMgM+2fVdCHNspUObXhq1l8CcjSbrAPy0D1+OxWp2GUYjeMO/ROZpRRY7UEtd\nLqw3hnNXzPcBl3C19r7KM+bBaxW7FuJSF3QrVsT2uMGpkn3kJH/f3Nk/vz5k\n94VReM3bSwylhWSrCy4RTn1Sfe11+iHTXq/ob9CY5HwyR2EaKZeox+Fs0imd\nFyz5Oe91rCxIq/HkzewYk1dF3shrFShGNvspwP7VC/UyMjZ0NvY/D7Ww93YJ\n9P9oa+g6d4T0xEimZk0Lf+8H+fEqjGQHOXu1h0TDTujwoMZy+m80+rr+NtIE\nbGiB5YLf1j2RypIGYitl5HKesQbd8mLp069l5gPXv04FczfIFBvu1Ibr0JFN\n+7aDWaQHFbkxvXClOsHXzwi63NfEVABj42ud24lQVXRa/yHaEW62+IQcz4Vf\ndGmENOv6dwng96xYX0fXaWACrkETiqR1b9HI4Zj2gtb76TRRjdQWOv3OYPPf\n+JXwx0X6ELe604cGGB+W0ftcFCyRuhoqqmfVYfGXXxM2uJIoQDPlMeym+VeB\n9yWdhV/Q+qgjtQpN1qf03eZEXmQPMmdqiGgKIFdDRcqPnqosQRR5bYIlS+2Q\ns/r/\r\n=wTwT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH71FOQemu0Vq5s6KqYGywW0qyFVYYuEXfd2D7lIiunVAiBY0T7EsVKhBd1ZM5DLYIDrcTqSqCW1k/gzLnPbDBHynA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181102033812_1541129965652_0.2522237702568575"},"_hasShrinkwrap":false},"0.5.1-learn.20181102060503":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181102060503","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"6f3021481447e754cc8b745dc0bfe0d22642cb8f","_id":"@atomist/sample-sdm@0.5.1-learn.20181102060503","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-qTUTG/Oi6LQmFHtaVEx2d7p/gP5mViWDmhA5iWx73D0uPrxhpYAgiFaEJI8XMaNST5p4xiW6n925M8KO0mbujg==","shasum":"94753ae0e17669ef853a75c6dd106d40e1f80981","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181102060503.tgz","fileCount":180,"unpackedSize":618560,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2+l1CRA9TVsSAnZWagAA+fUQAJyqHhzr9F1t7qb95xxB\nRgm0ilwJbOLKzCgdjoG3cfbRODUZc7i8+zdEArBbFjeQsTWHt2f6Jyzxdhmx\n1yV/+8mlX9lNYEwxWz4Kyt7QrblxujoAXNvm1G5Lr86lUEpFpfdaIzZqHd1I\n9dWauId6SeUZtog6eTFt8RRQQRPzzddidCInXUsYw5+eLeWsz8CgkaRjo2ms\nXl2vAZgR4XcvettM0p1WOlND4VH48HtPJGI331kbjvx3w14lJq2+pL2olE7F\na8v5IoZG7GA11R13xueWPn58xIU1Dbm9S36vbw1WrIAfnwMWmKFeHTdESK4x\nBZkYQPE4o1GTvBOYIG0C5Rc8IEoznhQildbPNZMqdsj0SWp8giW+OrOc2K3A\nzgRsPFXgAykMu3FEZe7FXMevPcRBU0NB453MShKz7BVtvC7HpRixVkwFNBeT\n23ExAXgmhwiKYivQPXaQUz4nYT7miXiR7E/1gDJWminvW6jDn84GFeatCkbo\ng3CkPrU6w2RO1Rsli5n2jIk3lNh61IPyaq4PVEmNtFEfa6SJGd9CB4IryRKE\nAqvWtyC2Hu2nhQMJzJWgvVBs90xFnH5MHkXhtPfqVdf1D5jpe/C4FNbbhgtb\nRP2i0YtWUpunCPsPzfUDL9/RpCG1TwDYwIf5XJvi4Mgx/en7LIKTxTCq0oGR\nb7dF\r\n=rEy8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBfL165R8iAyYOKsRpeYSGds7Z0jdhOjLd7Qt0Y5rk37AiEAt62IQFAe9opfGqF9yoVCvTOOgmSBZ3VN5upnhHSD3ok="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181102060503_1541138804635_0.6831342467602448"},"_hasShrinkwrap":false},"0.5.1-learn.20181102061132":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181102061132","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"^1.0.0-RC.2","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"9fd1f2a008dcc225958d8e5a8faaf76babd5932c","_id":"@atomist/sample-sdm@0.5.1-learn.20181102061132","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-iz1tmLmOUC8CHPFYLf1MsqzE8PYS2OpXDmsTMvu56iKNfGlEl57IftivoVZj5WohjNMjdb/E4yWZ+OYkYXGW1w==","shasum":"2e1c9c8f555069623ac7cfd96f3a725b50c564f8","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181102061132.tgz","fileCount":180,"unpackedSize":618776,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2+r5CRA9TVsSAnZWagAArikQAKEsP6PKkHPxZRzKSWv1\nx6OcHTlLNGRvw4hb3jvjTL4p8J8d9OMhx+OLW1a8DrbKXInc4xTgd2etHyDb\nraDWG16vkvN8Cnve2oAcOIgNBVRP7L+U7M7iVLQ7fOWIq2xsz4CYmqFiSg6T\nkQtFex3jsf60FGWM5bnyC+FLCDPISCs/zVInaF28pgsRFKwvd/2XOOUjUzOA\n+WaCaPB/rtj3smCfwa/7ptRAdwlzFlVg13WG5nbUJv4/6NpKwH9QxnDG4rNK\nFynlF42nX4uTdvVWCP035D7+m1+71PZ39oWoW2+MFcBswqtbZTCwP7Tc/q5Y\n9ycxHjZHgGXe/fj9LJg/xO7O2UKPL6x15j0MSmDZ5tXptpaoDqdK3ZEldl6A\nPCva5qFGhyBgFZl/6G1Jhp07z9I+A2h2O2WTbSldaFQiKFxpfiJItuWF57Gw\nIi0zpHF6E811ZmmkbJ/j3cB23w0gLY7QtpOSHRGqmrEIn3GI/huX2GrkvdIC\nz7URyWANtJwAzAp3md/oiWjgW/kA9nKoabzfIDHUSu0Dln8t6c9VJ/maOo6x\nie1AryFVFpf78x8IiP2Ozbd35kCFIrWSo9IclACDPl21Oyvyjty0amw1whJL\nynxc8xZT1jY1SuruwPfADw6PVdMRcLRSxeuWuJnTz7SamQFui5B6UdYbd3ee\n+mDk\r\n=QO+M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNiQfMJcQTA97dBevOMzsv4M3GmkDBwuUeZBSGXYd6WAIhAObpzJg2X0SbrBUkccFVvAJ0eBhOFqKK5lLmHhwsGDlm"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181102061132_1541139192780_0.3930555986183877"},"_hasShrinkwrap":false},"0.5.1-learn.20181102061447":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181102061447","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"https://r.atomist.com/3607222545","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"c2ae51bec781547704be7056a3da1c4104f71ae7","_id":"@atomist/sample-sdm@0.5.1-learn.20181102061447","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-OcKU9fayIzrSEbcYFwVG+k9bvqLjPoGtNRf4eQGykE4n50hMxrTgSQOWd92ffLIKX00YrR56bhwWipijHoXoOQ==","shasum":"7f68f30509ab4c93a516756f32a442ef32048b77","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181102061447.tgz","fileCount":177,"unpackedSize":617100,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2+u8CRA9TVsSAnZWagAAVZkP+QGRgP1zLRXhGwnVa1QJ\nYIP57otfI8HeKolA7AHpKT9dfsTcWid++OM2LImTun3kdvJyHA59EpYIZ+iB\nLCw5S1pykQXEzS5CLbc4/M97aPFdRJabFbLtbmwn4+nh5MeMTk6DVPcNe6ze\nHtGGVZsRbIun5IL5fCqvO/PKCe7+tOogpHMnC+bhy3UUqJveoDDad3MMSWiD\n2pkp2QYYOhChO4H3ODpRPNHsSez1scqV172/leh0YRDUdCSpM41t4MGBBr5T\nMDChdrH9qbIQL87c3gh4Tl/dIPPJKrTOCjaOof1I6/ZhCIPjFm+IbX3gTKyd\naYG/FFMVmZ3PoRDoJ8P8q7pZ4aiYWnXL4wtGue49quIow9oPBlTv6pptUKpN\nllWQowFpeU3dXYUF7CFYiYgXmTR0G11K0cCa/vFUlDCXBWokbuMQlG1zc5Ll\ndcs+BkKx8LnG0M9/ynH/MrS/6SxMrBNcWJUe6G4KHR+xEmY2wWTwLPhmt+oJ\nbFLpfCpw10e99VRxUC+jstELGJLhEzZv/dE8THJIO3pT61/zHPht14fB+sjT\nLToYXoLKN+BPche6eqFbVJa9O3THkcl+xrzx7rS3KF3iiT+1tW61TZpC/V25\nqbHGF6ZX9DaZwLI4CuO0Jmyiqjwjp69WX5Ap0FwJwOaagz33AchfH3jxTH0k\nhgyf\r\n=bllP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMKzPtyTmfSQyun7kOr/H58aLLHxoPCxs4o/tNWP3aJAIgUlZ/oFQlBDIdGMA4FN/0Q/wcBUDWLCAskiSg184eEFM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181102061447_1541139387456_0.9674413956510581"},"_hasShrinkwrap":false},"0.5.1-learn.20181102062409":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181102062409","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"https://r.atomist.com/3607222545","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"0e68d0bab03b9e0cac07c9dfd78ff58e73af3261","_id":"@atomist/sample-sdm@0.5.1-learn.20181102062409","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-3Et6M9cWB8k6cjRnUFuvuIqkR2BOwcIi0D9DqCOun8Z8esDgw8o7pVo5TPvAj4bMNy8zAFZpTgi46c6uyHQnoA==","shasum":"ead04a94622350c44ceb94696acd716312adb20a","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181102062409.tgz","fileCount":180,"unpackedSize":618297,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2+35CRA9TVsSAnZWagAAguUP/2FX9yObthJwRKU2yEK9\n1sHslD3XtRHTkajrt0RAdf1yfAePVwZmf//TRGtVbQaUwEoMgnc1azRQbfZp\nF629aUz6ZUdjxx0v+SPVZan7WMgu32d4Qbl+V6oK9kxB1Js/pmtGs1Pga5kS\n+574x1UhgzrXEQQ6IvSto519+pqe/ui2hl+V38+/uC7+QjfTTTEhRKIkGH0s\nftpxfUld44HgpGPnyy44qcDRJXwpciv8616Qxw64fgD3h2H+m71uitHFlF/Y\ntc43xdF7Itx1dD+0Zk0LTFFgguxuoiRCgevr80EV3FhBtmM3/Ou5E9RZA2w9\nMsrUKIq/D4v1VgseAWGbcgCJPHYh4alGW1DxtwXQXW55ZXeG3x4PCIMWRvSg\nT6LTes8mskMNpDa0w2ZoWv3SHtEpQZdrNd9R0YMwlXK+L29MnjQ5vpmrV+nw\nTACGEH2fkXjiAyhJdyrYtzqcU/e0jwNDodS+1RJPlv1uC56L+4TQVWfdTFlc\nRLpSQ/WWwVrqnYIsFoDgiP5qSZ5zvBx/qFe5b+JZaZ+vWwLeWur3QDnghAOc\nCZFlEI4Lc4eCVjGQm4uuI95oUTbws0tLlVjRH3MVNzEyyGRxrkxD+VyyIcaO\n5zABCPO+2jXtmRW0S0CcLDaRZWXX8syqzA0zkUZvKEkr3MSGf31DcLcwW+LF\n02yC\r\n=4/23\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGFVGv9dWQRxQmmQxS7xqRMp2/XHemORiJPQ+FIUY6+DAiEAnrGVf4hHEatAgo+cvI2xh8vDKXE/DW9i/CxL0CbmZmE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181102062409_1541139960967_0.8683235148798858"},"_hasShrinkwrap":false},"0.5.1-learn.20181102091438":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181102091438","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"https://r.atomist.com/3607222545","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"fcde19a9c02863ffb3b36dca2f03cbbedc393881","_id":"@atomist/sample-sdm@0.5.1-learn.20181102091438","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-BNTTWdbFGkV+qP2WrCbXmDRXMeRycMpzCx05GBrpNNx3B8bxGkJ9M3/p0hFEaJy5FLPmV8GeEtlT6K/Jnzez2g==","shasum":"71de972a9e704eda2748648f110e8b5ba9019926","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181102091438.tgz","fileCount":186,"unpackedSize":627613,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3BXnCRA9TVsSAnZWagAAw4kP/RSn+q8XSelPVtzlk4Dm\nOEpxAVwGMwCjZM9/SWogF1j6r0NQ9a8C3LSCCpUF1m/aGItnY+qGeMPWnQJE\nAHzSIziyLDIkvWcXWEvkL3qtRYK6+b/itx1ZBgsTbkFM0Mz0YN0v0apCLtSJ\n5+Da7w6yuV64BflEkGyI5zt78pO40ZaZ2Kpinxg8rrHAfgi8N3B6CRO+q2Zq\nftzSy1N4qjQN3vIW7ypyQ53xcPqDwb3UL2vkBLL3QtFaT6oCRHtxoHsjskoj\nTJwAM7AkYABjW+3+8e2Az/AvyB0pEslcjcTTyfxERX6VVbuZw2zzgyy6GCCC\nvCJuex6UlFu92s2qgZi1E8HudO1TEGYdUecjTld6mgwvcViQbIy3ikODA0Oh\n5PqcYukrfg0G4dQSXn6ohPg5nXpC2Dgo3FC2JXldw1bjgvC6DxKKh/RTAvbO\ncnpcMzE1ySbo+T2y8zClJwnnCzTLNIz3mNTQ953AKbsGhMJMraP4Pwl0tZdt\nKqe/U/cMA4ObqNDpkelATE62kAGsKgJV/5UOslWxqiv388+vfXeSRaGqGdpD\nSp624BEOjz5+/tSOSueImJXdaDYDpdBcrYdrMP600eHC5uL3yzbNkXCFA4ow\nEDNctGb31Q3YQyAwOrFrAiGBwF6EII+yGuyka6RzoDQOm8ouS9z0grSQtePW\nr8zV\r\n=YvhU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA/eRx4Gyrqu73k7q1FKO2Mbrye0nVybwrnK9EyrrVpOAiAFr3keiAX26mkMonS88yjW/QIQNj9x/OCa6rB8O3yVCw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181102091438_1541150183006_0.11940152350523436"},"_hasShrinkwrap":false},"0.5.1-learn.20181103074404":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181103074404","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"https://r.atomist.com/3607222545","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"536e3a94c2fe074d7edda6dde2cf440eff412f9e","_id":"@atomist/sample-sdm@0.5.1-learn.20181103074404","_npmVersion":"6.4.1","_nodeVersion":"10.13.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-hqDNo4NLxfZStNHhC5Jz+8/wOYqDsq/pLbGrjFotxR2Hk7Kk+rsxNLJ5IOPwJvNpbl/sj8bKoxz19AI8dDh3pw==","shasum":"76cd4a8a0d4c81c3b2d6fd37f81eae39ff57e2a2","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181103074404.tgz","fileCount":186,"unpackedSize":626448,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3VIXCRA9TVsSAnZWagAAVQMP/21Xi6GzM0/ZUUQ0nnX3\n2GJTKeicxR6dh5wtXaOZkZZCN7mIS61dBk+322jAIcqkJzgEGVjViCMZwety\nzHRJeCJKuVl0cmngh9F5HOaNXbQD/VMrDPY6iWI/Wxkr56YLzVSCYRvLFH2t\nb6AQiC3yh+4Hecic1ERHvHPoPxKNoBFZG6RMSmgxESFVJjLvDZ9iREtGUx4X\n/TsiDSOYTFWJ9xFpJ6jkBpFYc3LKHfW/r0MVyJUDjz3EFTFn6f+b9yTgxq83\n95Zr0eZRKr2NEE0Ajbh4ovzzk6d8nfnXE1jlE1VkZWsSUr2mSKTquQZ/P/AJ\n/znGEolDwHetxoMPgjkMAMj7Top9yDzYusm0Gff1Oq9U/td/w+Z5ly132Hyd\n6vRh6TsKr7GHUcLMFIuLvLufIIc/LgyRLArw8fxCV8sofbPXiceU+CH/5Y1r\nOPZUnqM5EYMmDN8jXn6zrWnKwlcvResONRwb6v7KGYkD30IEQHF2K0X91nKb\ndd25JwPqS0TxgqoHuMYlg3k2ITzQ8JRaHmVs5F+zYs9kWlpvpbKJPrzs22E2\nHmRNbiPDWuNeSCOQSrIfHPAJCHlYNtdargi74+CGHaa0MlWjs+4bO5bcgNV/\nR2es0pRBbtjDgaL+TgvJL8wOcn4vvtFZpWqroWywwURWcDJoP/ggPQfZVqri\nAA2Q\r\n=rK8y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE2DFG28Pm+nhg/BO8KFIVHoco8JwBCutmQT3SrAZxy4AiEAhz0hsnt8P2h1yvBJOkWfrIgvBXnki80uwDnmH/XUnYg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181103074404_1541231126549_0.038383429775882494"},"_hasShrinkwrap":false},"0.5.1-learn.20181103075141":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181103075141","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"https://r.atomist.com/3607222545","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"ab29537a6880323602e223f72349199a1e14865f","_id":"@atomist/sample-sdm@0.5.1-learn.20181103075141","_npmVersion":"6.4.1","_nodeVersion":"10.13.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-U7wsSbNmUhw8c8Bb+UOlCpKLb+WTKIvHcHhQQ8N55iZ2DmVRGPNxRxlHiVtgxbwAjIuPBsKYw/PA3DkIFrMYvg==","shasum":"7b797c52e366a3627f1d535b6515f98e34a00c3d","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181103075141.tgz","fileCount":186,"unpackedSize":626598,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3VPiCRA9TVsSAnZWagAACxAP/isEMp4kYJwQcKJKpkkx\n3YaAOFJZrDzHp/XWUpM7z2wLW6SBOzWwMJw4+08rJQj4UsLvbLTDgKmhiwRP\nBdBf9O01bxH+ihrRk4NR4MLgEqzQPo3h8go87uc3tzzCVCy+ubOoCNb1ZsYc\nWvLfU1DCl3FSSYSofKSwlEZDZV2OTR1cQ8eN4ZgOE32TWlC7Aj+2NmKkrZCI\niYHiljVA3L9QHODSSVwfzm3KDIgIOiw+20/mDotwe2KJQmE2837ttxacDnkb\ngPmlxI5QDzwZ4J9ZJI4XcJTqd42bEVjv4FUYgN63MVuu/csTDWtHljm4QJg6\nDw4xfkyOw3Rs4/hVCUGLVqsP7d4oP6HB1oiB2izGaLnV7xH15tq0GlcpYy9b\nVubTfNQdDVAMp+pXNitOQkYJAFTLvha/EvjROMjXiTqDMc/XdsPw+RBol7ia\nvduaux4QAfkU9LEOuXi0r6lIpeIEgB3A/zY6KjK92ufXtalKWY3oJ96Ap3lk\nfxIdO4dGqui+bGd9RqtD+d4ABhjXub7RQ3OrTN1q/VRaMfTDOMDuPML3EBCJ\nnxJBJjEYGr4qPqY4etHMF+420YpcU6Aa3Uu/9sUwY8p2nJkEzUWnqoPn45Bq\nJogViZoziPFeWC+JZNvEJu+Hg8IMTne9YauFk2K0JJJkhtQdXgf+aXHTeM6F\ny5vV\r\n=NKfR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDfKyjDJWFTSp6zraAL8ek7KNcW6+AkzRKWmcahgkIp5AiBu0YXfgTb+rxotyUEP0kbS7NmyA2xMVkqfZezZefMSGg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181103075141_1541231585501_0.40600854574817125"},"_hasShrinkwrap":false},"0.5.1-learn.20181103075331":{"name":"@atomist/sample-sdm","version":"0.5.1-learn.20181103075331","description":"Sample Atomist automation for software delivery","author":{"name":"Atomist","email":"support@atomist.com","url":"https://atomist.com/"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"keywords":["atomist","automation","github"],"homepage":"https://github.com/atomist/sample-sdm#readme","bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"dependencies":{"@atomist/automation-client":"^1.0.0-RC.2","@atomist/automation-client-ext-dashboard":"^1.0.0-RC.1","@atomist/automation-client-ext-eventlog":"^1.0.0-RC.1","@atomist/microgrammar":"^1.0.0-M.4","@atomist/sdm":"https://r.atomist.com/3607222545","@atomist/sdm-core":"^1.0.0-RC.2","@atomist/sdm-pack-build":"^1.0.0-RC.2","@atomist/sdm-pack-checkstyle":"^1.0.0-RC.2","@atomist/sdm-pack-cloudfoundry":"^1.0.0-RC.2","@atomist/sdm-pack-node":"^1.0.0-RC.2","@atomist/sdm-pack-sloc":"^1.0.0-RC.2","@atomist/sdm-pack-sonarqube":"^1.0.0-RC.2","@atomist/sdm-pack-spring":"https://r.atomist.com/2053585992","@atomist/slack-messages":"^1.0.0","@commitlint/config-conventional":"^6.1.3","@commitlint/lint":"^6.2.0","@commitlint/load":"^6.1.3","@types/lodash":"^4.14.109","@types/properties-reader":"0.0.1","logzio-nodejs":"^0.4.11","portfinder":"^1.0.13","properties-reader":"0.0.16","winston-logzio":"^1.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.0-RC.2","@types/mocha":"^2.2.48","@types/node":"^8.9.5","@types/power-assert":"^1.4.29","apollo-codegen":"^0.19.0","espower-typescript":"^8.1.3","graphql-code-generator":"^0.8.19","inquirer":"^6.0.0","mocha":"^4.1.0","npm-run-all":"^4.1.2","power-assert":"^1.4.4","prettier":"^1.11.1","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^3.3.0","tslint":"^5.9.1","typedoc":"^0.9.0","typescript":"^2.8.3"},"directories":{"test":"test"},"scripts":{"autostart":"npm-run-all --print-label --parallel watch:compile watch","autotest":"supervisor --watch src,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"npm-run-all compile test","clean":"npm-run-all clean:js clean:build","clean:build":"rimraf *-v8.log profile.txt build","clean:dist":"npm-run-all clean clean:npm","clean:js":"rimraf \"{src,test}/**/*.js\"","clean:npm":"rimraf node_modules","compile":"npm-run-all git:info compile:gql compile:ts","compile:gql":"npm-run-all gql:gen gql:copy","compile:ts":"tsc --project .","debug":"node $NODE_DEBUG_OPTION node_modules/@atomist/automation-client/start.client.js","fmt":"prettier --write \"**/*.graphql\"","git:info":"atm-git-info","gql:copy":"copyfiles \"./src/**/*.graphql\" build","gql:gen":"atm-gql-gen","lint":"npm-run-all lint:ts lint:gql","lint:ts":"tslint --format verbose --project . --exclude \"{build,node_modules}/**\" \"**/*.ts\"","lint:gql":"prettier --list-different \"src/graphql/**/*.graphql\"","lint:fix":"npm-run-all lint:ts:fix","lint:ts:fix":"npm run lint:ts -- --fix","start":"atm-start","test":"mocha --exit --require espower-typescript/guess \"test/**/*.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.ts}\"","typedoc":"typedoc --mode modules --excludeExternals --out build/typedoc src","watch:compile":"tsc --project . --watch","watch":"supervisor --watch build --quiet --exec npm -- run start"},"engines":{"node":"8.x.x","npm":"5.x.x"},"readme":"# sample-sdm\n\nInstance of an Atomist Software Delivery Machine that can be used as a sample or run for real on your Java and TypeScript projects.\n\n## What is a Software Delivery Machine?\n\n>A **software delivery machine** is a development process in a box.\n\nIt automates all steps in the flow from commit to production (potentially via staging environments), and many other actions, using the consistent model provided by the Atomist *API for software*.\n\n> Many teams have a blueprint in their mind for how they'd like to deliver software and ease their day to day work, but find it hard to realize. A Software Delivery Machine makes it possible.\n\nThe concept is explained in detail in Rod Johnson's blog [Why you need a Software Delivery Machine](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). This [video](https://vimeo.com/260496136) shows it in action.\n\nPlease see the [Atomist SDM library](https://github.com/atomist/sdm) for explanation on what an SDM can do. The present document describes how to get yours running.\n\n\n## Get Started\n\nThis delivery machine feeds on the Atomist API. You'll need to be a member of an Atomist workspace to run it. <!-- TODO: reference auth story -->\nCreate your own by [enrolling](https://github.com/atomist/welcome/blob/master/enroll.md) at [atomist.com](https://atomist.com).\n\nThings work best if you install an org webhook, so that Atomist receives events for all your GitHub repos.\n\n## Get your Software Delivery Machine\n\nIf the Atomist bot is in your Slack team, type `@atomist create sdm` to have Atomist create a personalized version of\n this repository for you.\n\nYou can fork and clone this repository.\n\n## Run Locally\n\nThis is an Atomist automation client. See [run an automation client](https://docs.atomist.com/developer/client/) for instructions on how to set up your environment and run it under Node.js.\n\nSee [integrations](#Integrations) for additional prerequisites according to the projects you're building.\n\nThe client logs to the console so you can see it go. Once it runs, here are some things to do:\n\n### Start a new project\n\nIn Slack, `@atomist create spring`. This will create a Spring Boot repository. The SDM will build it!\n\nTo enable deployment beyond the local one, `@atomist enable deploy`.\n\n### Push to an existing repository\n\nIf you have any Java or Node projects in your GitHub org, try linking one to a Slack channel (`@atomist link repo`), and then push to it.\nYou'll see Atomist react to the push, and the SDM might have some Goals it can complete.\n\n### Customize\n\nEvery organization has a different environment and different needs. Your software delivery machine is yours: change the code and do what helps you.\n\nIn `atomist.config.ts`, you can choose the `machine` to start with. `cloudFoundryMachine` and `k8sMachine` take care of the whole delivery process from project creation through deployment, while other machines focus only on one aspect, such as project creation, static analysis or autofixing problems in repositories.\n\n> Atomist is about developing your development experience by using your coding skills. Change the code, restart, and see your new automations and changed behavior across all your projects, within seconds.\n\nThe rest of this README describes some changes you might make.\n\n# About this Software Delivery Machine\n\n## Implementations of Atomist\n\nAtomist is a flexible system, enabling you to build your own automations or use those provided by Atomist or third parties.\n\nThis repository is a *reference implementation* of Atomist, which focuses on the goals of a typical delivery\n flow. You can fork it and modify it as the starting point for your own Atomist implementation,\n or use it purely as a reference.\n\n## Concepts\n\nThis repository shows how Atomist can automate important tasks and improve your delivery flow. Specifically:\n\n-   How Atomist **command handlers** can be used to create services\nthe right way every time, and help keep them up to date\n-   How Atomist **event handlers** can drive and improve a custom delivery experience, from commit through\nto deployment and testing\n\nIt demonstrates Atomist as the *API for software*, exposing\n\n-   *What we know*: The Atomist cortex, accessible through GraphQL queries and subscription joins\n-   *What just happened*: An event, triggered by a GraphQL subscription, which is contextualized with the existing knowledge\n-   *What you're working on*: A library that enables you to comprehend and manipulate the source code you're working on.\n\nAtomist is not tied to GitHub, but this repository focuses on using Atomist with GitHub.com or\nGitHub Enterprise.\n\n## Key Functionality\n\nThe following key functionality of this project will be available when you run this automation client in your team:\n\n-   *Project creation for Spring*. Atomist is not Spring specific, but we use Spring boot as an illustration here. Try `@atomist create spring`. The seed project used by default will be `spring-team/spring-rest-seed`.\n    -   If you want to add or modify the content of generated projects, modify `CustomSpringBootGeneratorParameters.ts` to specify your own seed. Just about any Spring Boot project will work as the transformation of a seed project is quite forgiving, and parses the seed to find the location and name of the `@SpringBootApplication` class, rather than relying on hard coding.\n    -   To perform sophisticated changes, such as dynamically computing content, modify the code in `springBootGenerator.ts`.\n-   *Delivery pipeline to either Kubernetes or Pivotal Cloud Foundry for Spring Boot projects*. This includes automatic local deployment of non-default branches on the same node as the automation client. The delivery pipeline is automatically triggered on pushes.\n-   *Upgrading Spring Boot version* across one or many repositories. Try `@atomist try to upgrade spring boot`. This will create a branch upgrading to Spring Boot `1.5.9` and wait for the build to complete. If the build succeeds, a PR will be created; if it fails, an issue will be created linking to the failed build log and offending branch. To choose a specific Spring Boot version, or see what happens when a bogus version triggers a failure, try `@atomist try to upgrade spring boot desiredBootVersion=<version>`. If you run such a command in a channel linked to an Atomist repository, it will affect only that repository. If you run it in a channel that is not linked, it will affect all repositories by default. You can add a `targets.repos=<regex>` parameter to specify a regular expression to target a subset of repo names. For example: `@atomist try to upgrade spring boot targets.repos=test.*`.\n\n## Plugging in Third Party Tools\n\nThis repo shows the use of Atomist to perform many steps itself.\n However, each of the goals used by Atomist here is pluggable.\n\nIt's also easy to integrate third party tools like Checkstyle.\n\n### Integrating CI tools\n\nOne of the tools you are most likely to integrate is CI. For example, you can integrate Jenkins, Travis or Circle CI with Atomist so that these tools are responsible for build. This has potential advantages in terms of scheduling and repeatability of environments.\n\nIntegrating a CI tool with Atomist is simple. Simply invoke Atomist hooks to send events around build and artifact creation.\n\nIf integrating CI tools, we recommend the following:\n\n-   CI tools are great for building and generating artifacts. They are often abused as a PaaS for `bash`. If you find your CI usage has you programming in `bash` or YML, consider whether invoking such operations from Atomist event handlers might be a better model.\n-   Use Atomist generators to create your CI files, and Atomist editors to keep them in synch, minimizing inconsistency.\n\n#### Example: Integrating Travis\n\ntbc\n\n### Integrating APM tools\n\n### Integrating with Static Analysis Tools\n\nAny tool that runs on code, such as Checkstyle, can easily be integrated.\n\nUse shell. node is good for this\n\n### Integrations\n\n### Choose a machine\n\nYou must set environment variables to choose a machine, if you override the default.\n\n```\nexport MACHINE_PATH=\"./software-delivery-machine/machines\"\nexport MACHINE_NAME=\"cloudFoundrySoftwareDeliveryMachine\"\n```\n\n### Local HTTP server\n\nTo run a local HTTP server to invoke via `curl` or for smoke testing, please set the following environment variable:\n\n```\nexport LOCAL_ATOMIST_ADMIN_PASSWORD=\"<value>\"\n\n```\n\n#### Java\n\nTo build Java projects on the automation client node, you'll need:\n\n-   JDK, for Maven and Checkstyle\n-   Maven, with `mvn` on the path\n\n#### Node\n\nTo build Node projects on the automation client node, you'll need:\n\n-   `npm` - v 5.8.0 or above\n-   `node`\n\n#### Configuration\n\nThe following configuration should be in your `~/.atomist/client.config.json` in order to\nsuccessfully connect your SDM:\n\n```json\n{\n  \"token\": \"<your github token>\",\n  \"teamIds\": [\n    \"<your team id>\"\n  ],\n  \"sdm\": {\n    \"rolar\": {\n      \"url\": \"https://rolar.cfapps.io\"\n    },\n    \"graphviz\": {\n        \"url\": \"<optional url to graphviz service>\"\n    },\n    \"cloudfoundry\": {\n      \"api\": \"https://api.run.pivotal.io\",\n      \"user\": \"<your Pivotal Cloud Foundry user name>\",\n      \"password\": \"<your Pivotal Cloud Foundry password>\",\n      \"org\": \"<your Pivotal Cloud Foundry organization name>\",\n      \"spaces\": {\n        \"production\": \"<your Pivotal Cloud Foundry production space name within your org>\",\n        \"staging\": \"<your Pivotal Cloud Foundry staging space name within your org>\"\n      }\n    },\n    \"checkstyle\": {\n      \"enabled\": false,\n      \"reviewOnlyChangedFiles\": true,\n      \"path\": \"/Users/cdupuis/Development/atomist/sample-sdm/test/checkstyle-8.8-all.jar\"\n    }\n  }\n}\n```\n\n##### Checkstyle\n\nCheckstyle is a style-checker for Java.\nFor the optional Checkstyle integration to work, set up two Checkstyle configuration as shown above.\n\nGet `checkstyle-8.8-all.jar` from [Checkstyle's download page](https://sourceforge.net/projects/checkstyle/files/checkstyle/8.8/).\n\n##### Cloud Foundry\n\nThis SDM allows deployment to Pivotal Cloud Foundry. For deployment to work you need to set your user,\npassword and org of your Cloud Foundry account. Additionally please configure two spaces to be used for\nstaging and production deployments.\n\n##### Kubernetes\n\nThe kubernetesSoftwareDevelopmentMachine included here deploys to an Atomist sandbox kubernetes environment, using\n[k8-automation](https://github.com/atomist/k8-automation) which we run inside our cluster. You can deploy the Spring Boot\nprojects created with `@atomist create spring` here, in order to try out the Kubernetes integration with the SDM.\n\n","readmeFilename":"README.md","gitHead":"ab29537a6880323602e223f72349199a1e14865f","_id":"@atomist/sample-sdm@0.5.1-learn.20181103075331","_npmVersion":"6.4.1","_nodeVersion":"10.13.0","_npmUser":{"name":"atomist","email":"npm@atomist.com"},"dist":{"integrity":"sha512-2l4heu6btZ44PQQJwwoVlnOENMuIwjBk9s7amwjFHPn2z7GyHeSmtwzkw/faepVT1egy248EjOzJ9wKx3ebbSQ==","shasum":"ad9af4c4e67e984fcccc3662267b4fd6960901a0","tarball":"https://registry.npmjs.org/@atomist/sample-sdm/-/sample-sdm-0.5.1-learn.20181103075331.tgz","fileCount":186,"unpackedSize":626598,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3VRGCRA9TVsSAnZWagAAx4UP/2Qou/Z0d6JJBAjnxu+X\nB7wL61CfC1/wnXDCjGJ1Qsgov2cXfOYrkZKTkd4fad8aL/cK7R+08mWwhED/\neB9/Z9AsRjXN9gf8WI3mGx8e1NkHVyqxGFSu73DjcwG/uib/9FOrE0sD2wHu\nbW0RR9LMnXzkkKHuX/YwrhlPuyxpxiTIQ3meVptnu2eMZ27YqbdrpjmVzdF0\nPy36nQ5u0ureEPfceDmSS0V62uJRNc0ZYV5DfsZNlmC9TLxdyEwjGm1Z+UNl\nUzLvISetUGJO+hY42yyLVBR9LR1HkttTyZPQZYapsVccyalAwmyfCG8uAFFR\n/gkHs2u+3R+xQGhhrBAj+Q52wjNdaYhxTkjiqEfkL5oZDwuglx7+YiIH4nx0\nQonbuapBbndQ3C/fbPGdrMcHcsiyA/sYvHmoTZw2AsP0cXOfq6fdYsnPOcMY\na5jDt0D0ttf6LWHD8sm75cc7SBUBP+L08Vcc84nh9BDYdSo/QvwNgVqTeRtz\n96IbnBI24AfH1S3ngac5tcJQlhQS1MhkQSC6ysTDrKVGC+jdYtCBPUv2kY8C\ndMsuOhe6w7kcFJ++KV5ZvG1l7OKN/DQ/1O8M5H7muYlDo2QaiRPonv11Wpkt\nq03jrYEmlJamLIg1FBzWHIkpMkwe6Sjy0v2Q/L8QxvLAolQxA/LTFkuXk4FN\nt1iM\r\n=/uFb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNmAboW86aNS/rSQmfVhoAb1pHztyBpy0A5yc0Ep+seAIhALZGyT0MwJ6jz3GQ3NwGmTsuMoSaOkoPVOrxET0l/VB+"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sample-sdm_0.5.1-learn.20181103075331_1541231686013_0.5244143735685562"},"_hasShrinkwrap":false}},"time":{"created":"2018-05-08T01:20:28.111Z","0.5.1-nortissej.less-verbose-addHeader.20180508011719":"2018-05-08T01:20:28.370Z","modified":"2023-02-23T17:59:10.766Z","0.5.1-20180509192856":"2018-05-09T19:32:39.059Z","0.5.1-20180510000937":"2018-05-10T00:13:20.618Z","0.5.1-no-env-vars.20180510023902":"2018-05-10T02:42:11.632Z","0.5.1-20180510025244":"2018-05-10T02:56:03.081Z","0.5.1-20180510025301":"2018-05-10T02:56:35.839Z","0.5.1-20180510031016":"2018-05-10T03:13:23.979Z","0.5.1-20180510031443":"2018-05-10T03:17:50.151Z","0.5.1-20180510181057":"2018-05-10T18:13:29.845Z","0.5.1-20180510204105":"2018-05-10T20:43:21.729Z","0.5.1-20180514115901":"2018-05-14T12:01:17.244Z","0.5.1-20180515155531":"2018-05-15T15:57:41.933Z","0.5.1-20180516101450":"2018-05-16T15:16:34.834Z","0.5.1-20180516113146":"2018-05-16T16:33:27.221Z","0.5.1-20180516173738":"2018-05-16T17:39:52.884Z","0.5.1-20180516190735":"2018-05-16T19:10:34.409Z","0.5.1-20180517100747":"2018-05-17T10:10:43.029Z","0.5.1-20180517100903":"2018-05-17T10:12:06.480Z","0.5.1-20180521210543":"2018-05-21T21:08:10.021Z","0.5.1-20180521222807":"2018-05-21T22:31:49.766Z","0.5.1-simpler-create-machine.20180521224327":"2018-05-21T22:45:56.043Z","0.5.1-20180522032702":"2018-05-22T03:29:40.155Z","0.5.1-update-deps.20180522073907":"2018-05-22T09:52:10.859Z","0.5.1-20180523055241":"2018-05-23T05:55:33.994Z","0.5.1-simpler-create-machine.20180523060512":"2018-05-23T06:08:11.611Z","0.5.1-20180523060927":"2018-05-23T06:12:27.529Z","0.5.1-20180523064648":"2018-05-23T06:49:44.052Z","0.5.1-20180523070430":"2018-05-23T07:07:25.198Z","0.5.1-20180523071213":"2018-05-23T07:15:06.559Z","0.5.1-20180523093626":"2018-05-23T09:39:38.386Z","0.5.1-20180523102836":"2018-05-23T10:31:33.087Z","0.5.1-20180524084900":"2018-05-24T08:52:04.480Z","0.5.1-githubStatus.20180525042137":"2018-05-25T04:24:28.702Z","0.5.1-20180525050336":"2018-05-25T05:06:25.294Z","0.5.1-pack.20180525125817":"2018-05-25T13:01:44.105Z","0.5.1-20180526090115":"2018-05-26T09:04:39.411Z","0.5.1-frozen.20180527040406":"2018-05-27T04:06:28.500Z","0.5.1-frozen.20180527051839":"2018-05-27T05:21:20.940Z","0.5.1-20180527051931":"2018-05-27T05:22:46.029Z","0.5.1-20180527083332":"2018-05-27T08:36:29.713Z","0.5.1-20180527105503":"2018-05-27T10:57:25.748Z","0.5.1-20180528040559":"2018-05-28T04:08:22.182Z","0.5.1-20180529045647":"2018-05-29T04:59:36.314Z","0.5.1-20180529051130":"2018-05-29T05:14:41.298Z","0.5.1-api.20180529103541":"2018-05-29T10:38:09.282Z","0.5.1-api.20180529123728":"2018-05-29T12:39:59.306Z","0.5.1-20180529223704":"2018-05-29T22:39:45.156Z","0.5.1-20180530040100":"2018-05-30T04:03:35.573Z","0.5.1-fixNodeBuildSmokeTest2.20180530040929":"2018-05-30T04:12:09.756Z","0.5.1-20180530041549":"2018-05-30T04:18:08.282Z","0.5.1-sdmupdate.20180530045331":"2018-05-30T04:55:51.697Z","0.5.1-20180530051834":"2018-05-30T05:21:05.628Z","0.5.1-20180530064720":"2018-05-30T06:50:16.975Z","0.5.1-latest-editor.20180530125705":"2018-05-30T12:59:42.999Z","0.5.1-latest-editor.20180530130944":"2018-05-30T13:12:21.168Z","0.5.1-latest-editor.20180530165338":"2018-05-30T16:56:59.871Z","0.5.1-latest-editor.20180530230726":"2018-05-30T23:09:52.930Z","0.5.1-latest-editor.20180531001051":"2018-05-31T00:13:08.877Z","0.5.1-latest-editor.20180531102924":"2018-05-31T10:32:12.711Z","0.5.1-20180531121448":"2018-05-31T12:17:10.599Z","0.5.1-20180531191428":"2018-05-31T19:16:51.303Z","0.5.1-20180601002235":"2018-06-01T00:24:59.766Z","0.5.1-rj.local.20180601084906":"2018-06-01T08:51:29.757Z","0.5.1-20180601085023":"2018-06-01T08:53:10.608Z","0.5.1-config-options-rework.20180601144411":"2018-06-01T14:46:30.091Z","0.5.1-config-options-rework.20180601145352":"2018-06-01T14:56:16.578Z","0.5.1-20180602033133":"2018-06-02T03:34:02.721Z","0.5.1-20180602234740":"2018-06-02T23:50:11.742Z","0.5.1-20180603002405":"2018-06-03T00:26:39.031Z","0.5.1-20180603063647":"2018-06-03T06:39:27.072Z","0.5.1-20180605035822":"2018-06-05T04:01:04.327Z","0.5.1-20180607000522":"2018-06-07T00:07:48.483Z","0.5.1-20180607231424":"2018-06-07T23:17:10.849Z","0.5.1-20180607231605":"2018-06-07T23:18:44.107Z","0.5.1-extract-packs.20180608084821":"2018-06-08T08:51:12.345Z","0.5.1-extract-packs.20180608121712":"2018-06-08T12:19:37.533Z","0.5.1-extract-packs.20180611043815":"2018-06-11T04:40:50.208Z","0.5.1-spring-packs.20180612193345":"2018-06-12T19:36:01.073Z","0.5.1-20180613210753":"2018-06-13T21:10:19.313Z","0.5.1-20180614003635":"2018-06-14T00:38:58.059Z","0.5.1-20180614084426":"2018-06-14T08:46:28.151Z","0.5.1-nortissej.spring-pack-options.20180615180227":"2018-06-15T18:04:48.547Z","0.5.1-nortissej.client-as-peer-everywhere.20180615212857":"2018-06-15T21:31:16.505Z","0.5.1-20180615222231":"2018-06-15T22:24:48.942Z","0.5.1-nortissej.client-as-peer-everywhere.20180615222755":"2018-06-15T22:30:37.318Z","0.5.1-20180615222850":"2018-06-15T22:31:10.848Z","0.5.1-20180615223344":"2018-06-15T22:35:52.127Z","0.5.1-20180618203300":"2018-06-18T20:35:39.777Z","0.5.1-20180619142458":"2018-06-19T14:27:24.202Z","0.5.1-20180619215608":"2018-06-19T21:58:42.252Z","0.5.1-20180620025819":"2018-06-20T03:00:49.691Z","0.5.1-20180620032521":"2018-06-20T03:27:39.032Z","0.5.1-20180620131215":"2018-06-20T13:15:12.185Z","0.5.1-20180620142952":"2018-06-20T14:32:21.229Z","0.5.1-20180620191756":"2018-06-20T19:20:12.881Z","0.5.1-nortissej.break-out-api.20180622202733":"2018-06-22T20:31:03.216Z","0.5.1-nortissej.break-out-api.20180622220509":"2018-06-22T22:07:30.124Z","0.5.1-nortissej.break-out-api.20180624184158":"2018-06-24T18:44:10.630Z","0.5.1-nortissej.break-out-api.20180624185252":"2018-06-24T18:55:03.498Z","0.5.1-nortissej.break-out-api.20180624201831":"2018-06-24T20:20:43.929Z","0.5.1-nortissej.break-out-api.20180625025617":"2018-06-25T02:59:24.570Z","0.5.1-20180625201022":"2018-06-25T20:13:25.224Z","0.5.1-20180625220522":"2018-06-25T22:07:59.726Z","0.5.1-command-simpl.20180628232253":"2018-06-28T23:25:43.077Z","0.5.1-command-simpl.20180629132239":"2018-06-29T13:25:16.962Z","0.5.1-command-simpl.20180629144429":"2018-06-29T14:47:39.779Z","0.5.1-20180629144513":"2018-06-29T14:48:18.823Z","0.5.1-20180629163828":"2018-06-29T16:41:01.328Z","0.5.1-transform.20180701214849":"2018-07-01T21:51:50.117Z","0.5.1-20180702124718":"2018-07-02T12:50:35.154Z","0.5.1-20180702172600":"2018-07-02T17:28:28.752Z","0.5.1-20180702182301":"2018-07-02T18:25:31.758Z","0.5.1-20180702185148":"2018-07-02T18:54:52.847Z","0.5.1-transform.20180703021719":"2018-07-03T02:19:17.087Z","0.5.1-20180703024254":"2018-07-03T02:45:43.982Z","0.5.1-20180703144541":"2018-07-03T14:48:06.212Z","0.5.1-20180703150124":"2018-07-03T15:03:15.768Z","0.5.1-20180703151107":"2018-07-03T15:13:20.510Z","0.5.1-20180703152650":"2018-07-03T15:28:49.732Z","0.5.1-20180703153611":"2018-07-03T15:38:44.254Z","0.5.1-20180703154643":"2018-07-03T15:50:37.619Z","0.5.1-20180703162809":"2018-07-03T16:30:50.066Z","0.5.1-20180703163137":"2018-07-03T16:35:22.048Z","0.5.1-20180703191412":"2018-07-03T19:17:35.672Z","0.5.1-20180703192322":"2018-07-03T19:26:33.077Z","0.5.1-20180703192637":"2018-07-03T19:29:49.750Z","0.5.1-20180703201232":"2018-07-03T20:13:37.398Z","0.5.1-20180703201910":"2018-07-03T20:22:42.544Z","0.5.1-20180703215047":"2018-07-03T21:54:39.865Z","0.5.1-20180703225640":"2018-07-03T23:00:00.624Z","0.5.1-sdm-update.20180704022934":"2018-07-04T02:32:25.496Z","0.5.1-compose.20180704075804":"2018-07-04T08:00:59.170Z","0.5.1-compose.20180704080653":"2018-07-04T08:09:25.504Z","0.5.1-20180704090100":"2018-07-04T09:03:31.215Z","0.5.1-20180705000149":"2018-07-05T00:04:24.012Z","0.5.1-20180705012256":"2018-07-05T01:25:58.733Z","0.5.1-20180705040834":"2018-07-05T04:11:23.892Z","0.5.1-20180705213459":"2018-07-05T21:37:39.248Z","0.5.1-new-build.20180706014225":"2018-07-06T01:45:02.934Z","0.5.1-20180708035112":"2018-07-08T03:55:47.711Z","0.5.1-latest-sdm.20180709000207":"2018-07-09T00:06:41.506Z","0.5.1-20180709151622":"2018-07-09T15:21:19.426Z","0.5.1-20180710005007":"2018-07-10T00:58:23.218Z","0.5.1-nortissej.createTransform.20180710013505":"2018-07-10T01:41:31.074Z","0.5.1-20180710013823":"2018-07-10T01:44:39.818Z","0.5.1-20180710014956":"2018-07-10T01:54:37.460Z","0.5.1-20180710050817":"2018-07-10T05:13:45.195Z","0.5.1-20180710051017":"2018-07-10T05:15:49.415Z","0.5.1-20180710070610":"2018-07-10T07:10:05.448Z","0.5.1-20180710124137":"2018-07-10T12:47:04.973Z","0.5.1-20180710130643":"2018-07-10T13:11:30.482Z","0.5.1-20180710201346":"2018-07-10T20:18:56.769Z","0.5.1-20180710212339":"2018-07-10T21:29:02.355Z","0.5.1-20180710221517":"2018-07-10T22:25:45.909Z","0.5.1-20180710233305":"2018-07-10T23:39:08.816Z","0.5.1-20180711104417":"2018-07-11T10:49:05.312Z","0.5.1-20180711152429":"2018-07-11T15:31:13.489Z","0.5.1-20180712010908":"2018-07-12T01:13:48.541Z","0.5.1-20180712011315":"2018-07-12T01:18:07.780Z","0.5.1-20180713054024":"2018-07-13T05:44:57.559Z","0.5.1-20180713081701":"2018-07-13T08:23:40.071Z","0.5.1-20180713082231":"2018-07-13T08:27:17.159Z","0.5.1-lieven.reenable-local-deployment.20180713084032":"2018-07-13T08:45:47.935Z","0.5.1-20180715224140":"2018-07-15T22:46:24.688Z","0.5.1-20180715230021":"2018-07-15T23:05:45.879Z","0.5.1-20180718011830":"2018-07-18T01:24:22.142Z","0.5.1-extract-packs.20180718085509":"2018-07-18T07:02:46.121Z","0.5.1-20180718101514":"2018-07-18T10:19:58.972Z","0.5.1-20180723192721":"2018-07-23T19:34:22.521Z","0.5.1-20180725114709":"2018-07-25T11:52:17.179Z","0.5.1-slalom2.20180730184514":"2018-07-30T18:50:35.277Z","0.5.1-20180730210934":"2018-07-30T21:13:57.292Z","0.5.1-20180730215420":"2018-07-30T21:57:30.730Z","0.5.1-20180730222732":"2018-07-30T22:31:14.788Z","0.5.1-20180731014217":"2018-07-31T01:46:27.341Z","0.5.1-20180731015205":"2018-07-31T01:56:36.691Z","0.5.1-20180806044153":"2018-08-06T04:46:58.849Z","0.5.1-20180806052143":"2018-08-06T05:25:52.275Z","0.5.1-20180806053213":"2018-08-06T05:38:25.790Z","0.5.1-20180806073442":"2018-08-06T07:38:28.466Z","0.5.1-20180806081018":"2018-08-06T08:15:08.086Z","0.5.1-20180808084410":"2018-08-08T08:48:44.577Z","0.5.1-20180809024527":"2018-08-09T02:50:38.247Z","0.5.1-20180809175220":"2018-08-09T17:57:49.012Z","0.5.1-20180809200530":"2018-08-09T20:09:46.277Z","0.5.1-20180809235506":"2018-08-10T00:01:04.192Z","0.5.1-20180810014340":"2018-08-10T01:47:32.666Z","0.5.1-20180810094403":"2018-08-10T09:48:05.682Z","0.5.1-20180814011124":"2018-08-14T01:16:52.663Z","0.5.1-useCloudFoundryPack.20180816032939":"2018-08-16T03:34:36.878Z","0.5.1-useCloudFoundryPack.20180816222925":"2018-08-16T22:34:32.814Z","0.5.1-useCloudFoundryPack.20180817020839":"2018-08-17T02:12:52.210Z","0.5.1-new-boot.20180826070531":"2018-08-26T07:09:35.066Z","0.5.1-new-boot.20180826234519":"2018-08-26T23:49:54.886Z","0.5.1-20180827053811":"2018-08-27T05:42:27.647Z","0.5.1-master.20180828085002":"2018-08-28T08:55:13.219Z","0.5.1-master.20180829091039":"2018-08-29T09:18:48.052Z","0.5.1-master.20180829152133":"2018-08-29T15:26:23.463Z","0.5.1-noise.20180830135615":"2018-08-30T14:00:33.572Z","0.5.1-master.20180830163615":"2018-08-30T16:41:02.226Z","0.5.1-master.20180830173111":"2018-08-30T17:34:47.390Z","0.5.1-master.20180905005014":"2018-09-05T00:52:17.030Z","0.5.1-master.20180905011214":"2018-09-05T01:14:14.614Z","0.5.1-update-m3.20180905082018":"2018-09-05T08:22:18.303Z","0.5.1-master.20180905091816":"2018-09-05T09:20:43.032Z","0.5.1-update-m3.20180905093907":"2018-09-05T09:41:07.180Z","0.5.1-master.20180906160318":"2018-09-06T16:05:33.268Z","0.5.1-master.20180907225630":"2018-09-07T22:59:06.036Z","0.5.1-atomist-update-branch-master-1536937963186.20180914175421":"2018-09-14T17:56:49.497Z","0.5.1-master.20180914180007":"2018-09-14T18:02:26.783Z","0.5.1-master.20180914182742":"2018-09-14T18:33:22.252Z","0.5.1-pcf-goal.20180918031256":"2018-09-18T03:15:24.652Z","0.5.1-master.20180919041321":"2018-09-19T04:17:32.127Z","0.5.1-atomist-update-branch-master-1537901718532.20180925191221":"2018-09-25T19:15:00.434Z","0.5.1-master.20180925191314":"2018-09-25T19:18:33.574Z","0.5.1-master.20180926150521":"2018-09-26T15:09:31.053Z","0.5.1-master.20180926163241":"2018-09-26T16:36:30.570Z","0.5.1-deploy-both.20180926164949":"2018-09-26T16:52:07.858Z","0.5.1-deploy-both.20180926172324":"2018-09-26T17:25:35.567Z","0.5.1-master.20180926173442":"2018-09-26T17:38:53.330Z","0.5.1-master.20180926184429":"2018-09-26T18:49:57.670Z","0.5.1-updates.20181003141234":"2018-10-03T14:15:01.206Z","0.5.1-updates.20181003154209":"2018-10-03T15:44:19.159Z","0.5.1-master.20181003172619":"2018-10-03T17:32:00.215Z","0.5.1-master.20181003222050":"2018-10-03T22:23:54.139Z","0.5.1-riff.20181018004805":"2018-10-18T00:49:36.369Z","0.5.1-riff.20181018035031":"2018-10-18T03:51:55.834Z","0.5.1-atomist-update-latest-1540938130032.20181101043939":"2018-11-01T04:40:56.184Z","0.5.1-master.20181101044648":"2018-11-01T04:50:38.495Z","0.5.1-learn.20181101111245":"2018-11-01T11:14:02.826Z","0.5.1-learn.20181101111634":"2018-11-01T11:17:47.755Z","0.5.1-learn.20181102033812":"2018-11-02T03:39:25.875Z","0.5.1-learn.20181102060503":"2018-11-02T06:06:44.783Z","0.5.1-learn.20181102061132":"2018-11-02T06:13:12.986Z","0.5.1-learn.20181102061447":"2018-11-02T06:16:27.621Z","0.5.1-learn.20181102062409":"2018-11-02T06:26:01.109Z","0.5.1-learn.20181102091438":"2018-11-02T09:16:23.261Z","0.5.1-learn.20181103074404":"2018-11-03T07:45:26.672Z","0.5.1-learn.20181103075141":"2018-11-03T07:53:05.722Z","0.5.1-learn.20181103075331":"2018-11-03T07:54:46.240Z"},"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":"Sample Atomist automation for software delivery","homepage":"https://github.com/atomist/sample-sdm#readme","keywords":["atomist","automation","github"],"repository":{"type":"git","url":"git+https://github.com/atomist/sample-sdm.git"},"author":{"name":"Atomist, Inc."},"bugs":{"url":"https://github.com/atomist/sample-sdm/issues"},"license":"Apache-2.0","readme":"","readmeFilename":""}