{"id":22351913,"url":"https://github.com/screwdriver-cd/scm-base","last_synced_at":"2025-07-30T07:32:02.239Z","repository":{"id":45174736,"uuid":"65760329","full_name":"screwdriver-cd/scm-base","owner":"screwdriver-cd","description":"Base class defining the interface for source control implementations","archived":false,"fork":false,"pushed_at":"2024-03-25T20:39:33.000Z","size":197,"stargazers_count":1,"open_issues_count":1,"forks_count":11,"subscribers_count":20,"default_branch":"master","last_synced_at":"2024-04-26T01:41:12.052Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cd.screwdriver.cd/pipelines/10","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/screwdriver-cd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-08-15T19:50:29.000Z","updated_at":"2024-06-19T20:06:40.208Z","dependencies_parsed_at":"2024-03-25T21:51:13.899Z","dependency_job_id":null,"html_url":"https://github.com/screwdriver-cd/scm-base","commit_stats":{"total_commits":103,"total_committers":30,"mean_commits":3.433333333333333,"dds":0.8155339805825242,"last_synced_commit":"c5364a1dd344240102af795a2cf5d608672e0417"},"previous_names":[],"tags_count":94,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwdriver-cd%2Fscm-base","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwdriver-cd%2Fscm-base/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwdriver-cd%2Fscm-base/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwdriver-cd%2Fscm-base/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/screwdriver-cd","download_url":"https://codeload.github.com/screwdriver-cd/scm-base/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228106386,"owners_count":17870438,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-04T12:16:30.201Z","updated_at":"2024-12-04T12:16:31.046Z","avatar_url":"https://github.com/screwdriver-cd.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Scm Base\n[![Version][npm-image]][npm-url] ![Downloads][downloads-image] [![Build Status][status-image]][status-url] [![Open Issues][issues-image]][issues-url] ![License][license-image]\n\n\u003e Base class for defining the behavior between Screwdriver and source control management (SCM) systems\n\n## Usage\n\n```bash\nnpm install screwdriver-scm-base\n```\n\n## Interface\nThis is a promise based interface for interacting with a source control management system\n\n### configure\nThe `configure` function takes in an object and resets the configuration values\n\n### addWebhook\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config            | Object | Configuration Object |\n| config.scmUri     | String | SCM URI to add the webhook to (e.g., \"github.com:8888:branchName\" |\n| config.token      | String | Access token for SCM |\n| config.webhookUrl | String | The URL to use for webhook notifications |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\n\nUpdate the repository with the desired webhook configuration.\n\n#### Expected Promise response\n\n1. Resolves when the webhook is correctly attached to the repository\n1. Rejects when the repository was unable to be updated with the webhook configuration\n\n### addDeployKey\nRequired parameters:\n\n| Parameter              | Type  |  Description |\n| :-------------         | :---- | :-------------|\n| config                 | Object | Configuration Object |\n| config.checkoutUrl     | String | Checkout url for a repo to parse |\n| config.token           | String | Access token for SCM |\n| config.scmContext      | String | (optional) The name of scm context |\n\n#### Expected Outcome\n\nAdd deploy public key counterpart to the repository.\n\n#### Expected Promise response\n\n1. Resolves when the deploy key is successfully generated and added\n1. Rejects when the deploy key fails to generate or add\n\n### autoDeployKeyGenerationEnabled\nRequired parameters:\n\n| Parameter              | Type  |  Description |\n| :-------------         | :---- | :-------------|\n| config                 | Object | Configuration Object |\n| config.scmContext      | String | (optional) The name of scm context |\n\n#### Expected Outcome\n\nReturns whether auto deploy key generation is enabled or not.\n\n#### Expected Promise response\n\n1. Resolves to true/false corresponding to the flag status\n\n### parseUrl\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config             | Object | Configuration Object |\n| config.checkoutUrl | String | Checkout url for a repo to parse |\n| config.rootDir | String | (optional) Root directory where source code lives (ex: src/app/component) |\n| config.scmContext | String | (optional) The name of scm context |\n| config.token  | String | Access token for scm |\n\n#### Expected Outcome\nAn scmUri (ex: `github.com:1234:branchName`, where 1234 is a repo ID number), which will be a unique identifier for the repo and branch in Screwdriver.\n\n#### Expected Promise response\n1. Resolve with an scm uri for the repository (e.g.: github.com:12345:master or github.com:12345:master:src/app/component)\n2. Reject if not able to parse url\n\n### parseHook\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| headers        | Object | The request headers associated with the webhook payload |\n| payload        | Object | The webhook payload received from the SCM service |\n\n#### Expected Outcome\nA key-map of data related to the received payload in the form of:\n```js\n{\n    action: 'opened',   // can be 'opened', 'reopened', 'closed', or 'synchronized' for type 'pr'; 'push' for type 'repo'\n    branch: 'mynewbranch',\n    checkoutUrl: 'https://batman@bitbucket.org/batman/test.git',\n    hookId: '81e6bd80-9a2c-11e6-939d-beaa5d9adaf3', // webhook event uuid\n    lastCommitMessage: 'This is the last commit message', // get a message of the last one from commits object\n    prNum: 3,\n    prRef: 'pull/3/merge',\n    prSource: 'fork', // If type is 'pr', prSource is 'fork' or 'branch'\n    scmContext: 'github:github.com',\n    sha: '9ff49b2d1437567cad2b5fed7a0706472131e927',\n    type: 'pr',         // can be 'pr' or 'repo'\n    username: 'robin'  // should be the actor/creator of the webhook event (not necessarily the author)\n}\n```\n\n#### Expected Promise response\n1. Resolve with a parsed hook object\n2. Reject if not able to parse hook\n\n### getChangedFiles\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config         | Object | Yes | Configuration Object |\n| config.type    | String | The type of action from Git (can be 'pr' or 'repo') |\n| config.payload | Object | The webhook payload received from the SCM service |\n| config.token   | String | Access token for scm |\n\n#### Expected Outcome\nAn array of file paths that were changed:\n```js\n['README.md', 'folder/screwdriver.yaml'] // array of changed files\n```\n\n#### Expected Promise response\n1. Resolve with an array of files\n2. Reject if not able to parse hook\n\n### getCheckoutCommand\nRequired parameters:\n\n| Parameter        | Type  | Required |  Description |\n| :-------------   | :---- | :--------| :---- |\n| config        | Object | Yes | Configuration Object |\n| config.branch | String | Yes | Pipeline branch |\n| config.host | String | Yes | Scm host (ex: github.com) |\n| config.manifest | String | No | Repo Manifest URL |\n| config.org | String | Yes | Scm org (ex: screwdriver-cd) |\n| config.prRef | String | No | PR branch or reference |\n| config.repo | String | Yes | Scm repo (ex: guide) |\n| config.rootDir | String | No | Root directory where source code lives (ex: src/app/component) |\n| config.sha | String | Yes | Scm sha |\n| config.scmContext | String | No | The name of scm context |\n\n#### Expected Outcome\nCheckout command in the form of:\n```js\n{\n    name: 'sd-checkout-code', // must be 'sd-checkout-code' exactly\n    command: 'git clone https://github.com/screwdriver-cd/guide'\n}\n```\n\n#### Expected Promise response\n1. Resolve with a checkout command object for the repository\n2. Reject if not able to get checkout command\n\n### getSetupCommand\nInternally calls getCheckoutCommand to get just the checkout command for a build, given a pipeline model and build configuration.\n\nRequired Parameters:\n\n| Parameter        | Type  | Required |  Description |\n| :-------------   | :---- | :--------| :---- |\n| config        | Object | Yes | Configuration Object |\n| config.pipeline | PipelineModel | Yes | Pipeline model |\n| config.job | Object | Yes |Job config with repoManifest annotation\n| config.build | Object | Yes | Build config with sha and possibly prRef |\n\n### decorateUrl\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.scmUri | String | Scm uri (ex: `github.com:1234:branchName`) |\n| config.token  | String | Access token for scm |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nDecorated url in the form of:\n```js\n{\n    url: 'https://github.com/screwdriver-cd/scm-base',\n    name: 'screwdriver-cd/scm-base',\n    branch: 'branchName'\n}\n```\n\n#### Expected Promise response\n1. Resolve with a decorated url object for the repository\n2. Reject if not able to get decorate url\n\n### decorateCommit\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.scmUri        | String | Scm uri (ex: `github.com:1234:branchName`) |\n| config.sha     | String | Commit sha to decorate |\n| config.token | String | Access token for scm |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nDecorated commit in the form of:\n```js\n{\n    url: 'https://github.com/screwdriver-cd/scm-base/commit/5c3b2cc64ee4bdab73e44c394ad1f92208441411',\n    message: 'Use screwdriver to publish',\n    author: {\n        url: 'https://github.com/d2lam',\n        name: 'Dao Lam',\n        username: 'd2lam',\n        avatar: 'https://avatars3.githubusercontent.com/u/3401924?v=3\u0026s=400'\n    }\n}\n```\n\n#### Expected Promise response\n1. Resolve with a decorate commit object for the repository\n2. Reject if not able to decorate commit\n\n### decorateAuthor\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.token | String | Access token for scm |\n| config.username     | String | Author to decorate |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nDecorated author in the form of:\n```js\n{\n    url: 'https://github.com/d2lam',\n    name: 'Dao Lam',\n    username: 'd2lam',\n    avatar: 'https://avatars3.githubusercontent.com/u/3401924?v=3\u0026s=400'\n}\n```\n\n#### Expected Promise response\n1. Resolve with a decorate author object for the repository\n2. Reject if not able to decorate author\n\n### getPermissions\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.scmUri | String | The scm uri to get permissions on (ex: `github.com:1234:branchName`) |\n| config.token | String | Access token for scm |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nPermissions for a given token on a repository in the form of:\n```js\n{\n    admin: true,\n    push: true,\n    pull: true\n}\n```\n\n#### Expected Promise response\n1. Resolve with a permissions object for the repository\n2. Reject if not able to get permissions\n\n### getOrgPermissions\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.organization | String | The scm organization to get permissions on (ex: `screwdriver-cd`) |\n| config.username | String | The user to get permissions on (ex: `foo`) |\n| config.token | String | Access token for scm |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nPermissions for a given user on a organization in the form of:\n```js\n{\n    admin: false,\n    member: true\n}\n```\n\n#### Expected Promise response\n1. Resolve with a permissions object for the organization\n2. Reject if not able to get permissions\n\n### getCommitSha\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.scmUri | String | The scm uri (ex: `github.com:1234:branchName`) |\n| config.token | String | Access token for scm |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nThe commit sha for a given branch on a repository.\n\n#### Expected Promise response\n1. Resolve with a commit sha string for the given `scmUri`\n2. Reject if not able to get a sha\n\n### getCommitRefSha\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config        | Object | Configuration Object |\n| config.token | String | Access token for scm |\n| config.owner | String | Owner of target repository |\n| config.repo | String | Target repository |\n| config.ref | String | Reference of the commit |\n| config.scmContext | String | (optional) The name of scm context |\n\n#### Expected Outcome\nThe commit sha for a ref on a repository.\n\n#### Expected Promise response\n1. Resolve with a commit sha string for the given `owner`, `repo` and `ref`\n2. Reject if not able to get a sha\n\n### updateCommitStatus\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.buildStatus | String | Yes | The screwdriver build status to translate into scm commit status |\n| config.context | String | No | The status context |\n| config.description | String | No | The status description |\n| config.jobName | String | No | Optional name of the job that finished |\n| config.pipelineId | Number | No | The pipeline id |\n| config.scmContext | String | No | The name of scm context |\n| config.scmUri | String | Yes | The scm uri (ex: `github.com:1234:branchName`) |\n| config.sha | String | Yes | The scm sha to update a status for |\n| config.token | String | Yes | Access token for scm |\n| config.url | String | No | The target url for setting up details |\n\n#### Expected Outcome\nUpdate the commit status for a given repository and sha.\n\n#### Expected Promise Response\n1. Resolve when the commit status was updated\n2. Reject if the commit status fails to update\n\n### getFile\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.path | String | Yes | The path to the file on scm to read |\n| config.ref | String | No | The reference to the scm repo, could be a branch or sha |\n| config.scmUri | String | Yes | The scm uri (ex: `github.com:1234:branchName`) |\n| config.token | String | Yes | Access token for scm |\n| config.scmContext | String | No | The name of scm context |\n\n#### Expected Outcome\nThe contents of the file at `path` in the repository\n\n#### Expected Promise Response\n1. Resolve with the contents of `path`\n2. Reject if the `path` cannot be downloaded, decoded, or is not a file\n\n### getBellConfiguration\n\n#### Expected Outcome\nA configuration that can be passed to the [bell][bell] OAuth module to authenticate users.\n\n#### Expected Promise Response\n1. Resolve with a valid [bell][bell] configuration\n\n### getOpenedPRs\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.scmUri | String | Yes | The scm uri (ex: `github.com:1234:branchName`) |\n| config.token | String | Yes | Access token for scm |\n| config.scmContext | String | No | The name of scm context |\n\n#### Expected Outcome\nThe list of objects consist of PR names and refs (either a branch or a sha) for the pipeline. For example:\n```\n[{\n  name: 'PR-5',\n  ref: '73675432e1288f67332af3ecd0155cf455af1492'\n}, {\n  name: 'PR-6',\n  ref: 'dfbbc032fa331a95ee5107d1f16e9ff5f7c9d2fa'\n}]\n```\n#### Expected Promise Response\n1. Resolve with the list of objects consists of PR names and refs\n2. Reject if the input or output is not valid\n\n### getPrInfo\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.scmUri | String | Yes | The scm uri (ex: `github.com:1234:branchName`) |\n| config.token | String | Yes | Access token for scm |\n| config.prNum | Integer | Yes | The PR number used to fetch the PR |\n| config.scmContext | String | No | The name of scm context |\n\n#### Expected Outcome\nThe object consists of PR name, sha, ref, and url for the pipeline.\n\n#### Expected Promise Response\n1. Resolve with the object consists of PR name, sha, ref, and url\n2. Reject if the input or output is not valid\n\n### addPrComment\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.scmUri | String | Yes | The scm uri (ex: `github.com:1234:branchName`) |\n| config.token | String | Yes | Access token for scm |\n| config.prNum | Integer | Yes | The PR number used to fetch the PR |\n| config.comment | String | Yes | The PR comment |\n| config.scmContext | String | No | The name of scm context |\n\n#### Expected Outcome\nThe object consisting of PR comment ID, create time, and username.\n\n#### Expected Promise Response\n1. Resolve with the object consists of PR comment ID, create time, and username\n2. Reject if the input or output is not valid\n\n### getScmContexts\nNo parameters are required.\n\n#### Expected Outcome\nThe array of scm context names (e.g. [github:github.com, gitlab:my-gitlab])\n\n#### Expected Response\n1. The array of scm context names\n\n### getScmContext\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.hostname | String | Yes | The scm host name (ex: `github.com`) |\n\n#### Expected Outcome\nThe matching scm context name string (e.g. github:github.com)\n\n#### Expected Response\n1. The matching scm context name\n\n### canHandleWebhook\nThe parameters required are:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| headers        | Object | The request headers associated with the webhook payload |\n| payload        | Object | The webhook payload received from the SCM service |\n\n#### Expected Outcome\nThe received webhook is available or not as boolean.\n\n#### Expected Promise Response\n1. Resolve with the received webhook is available or not.\n2. Reject if the input or output is not valid\n\n### getBranchList\nThe parameters required are:\n\n| Parameter        | Type  | Required | Description |\n| :-------------   | :---- | :------- | :-------------|\n| config        | Object | Yes | Configuration Object |\n| config.scmUri | String | Yes | The scm uri (ex: `github.com:1234:branchName`) |\n| config.token | String | Yes | Access token for scm |\n\n#### Expected Outcome\nThe array of objects consisting of branch names.\n\n#### Expected Promise Response\n1. Resolve with an array of objects consisting of branch names.\n\n### getDisplayName (overriding needs only the case of `scm-router`)\nThe parameters required are:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| scmContext        | String | The name of scm context |\n\n#### Expected Outcome\nThe display name of scm context\n\n#### Expected Response\n1. The display name of scm context\n\n### getReadOnlyInfo (overriding needs only the case of `scm-router`)\nThe parameters required are:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| scmContext        | String | The name of scm context |\n\n#### Expected Outcome\nRead-only SCM config\n\n#### Expected Response\n1. Read-only SCM config\n\n### openPr\n| Parameter          | Type  | Required | Description |\n| :-------------     | :---- | :------- | :-------------|\n| config             | Object | Yes | Configuration Object |\n| config.checkoutUrl | String | Yes | Checkout url for a repo|\n| config.token       | String | Yes | Access token for scm |\n| config.title       | String | Yes | Pull request title   |\n| config.message     | String | Yes | Pull request message |\n\n#### Expected Outcome\nAn object containing information of new pull request\n\n#### Expected Response\n1. Pull request object\n\n#### isEnterpriseUser\nRequired parameters:\n\n| Parameter        | Type  |  Description |\n| :-------------   | :---- | :-------------|\n| config     | Object | The config object |\n| config.token | String | The github token to interact with the graphql api |\n| config.slug     | String | The github enterprise slug |\n| config.login    | String | The github user's login name |\n\n#### Expected Outcome\n1. Returns True or False\n\n## Extending\nTo make use of the validation functions, the functions to override are:\n\n1. `_addWebhook`\n1. `_addDeployKey`\n1. `_autoDeployKeyGenerationEnabled`\n1. `_parseUrl`\n1. `_parseHook`\n1. `_getChangedFiles`\n1. `_getCheckoutCommand`\n1. `_decorateUrl`\n1. `_decorateCommit`\n1. `_decorateAuthor`\n1. `_getPermissions`\n1. `_getOrgPermissions`\n1. `_getCommitSha`\n1. `_addPrComment`\n1. `_updateCommitStatus`\n1. `_getFile`\n1. `_getOpenedPRs`\n1. `_getBellConfiguration`\n1. `_getPrInfo`\n1. `stats` \n1. `_getScmContexts`\n1. `_getScmContext`\n1. `_canHandleWebhook` \n1. `_getBranchList`\n1. `_openPr`\n1. `getDisplayName` (overriding needs only the case of `scm-router`)\n1. `getReadOnlyInfo` (overriding needs only the case of `scm-router`)\n1. `_isEnterpriseUser`\n\n\n```js\nclass MyScm extends ScmBase {\n    // Implement the interface\n    _getFile(config) {\n        // do stuff here to lookup scmUri\n        return Promise.resolve('these are contents that are gotten')\n    }\n}\n\nconst scm = new MyScm({});\nscm.getFile({\n    scmUri: 'github.com:12345:master',\n    path: 'screwdriver.yaml',\n    token: 'abcdefg'\n}).then(data =\u003e {\n    // do something...\n});\n```\n\n## Testing\n\n```bash\nnpm test\n```\n\n## License\n\nCode licensed under the BSD 3-Clause license. See LICENSE file for terms.\n\n[npm-image]: https://img.shields.io/npm/v/screwdriver-scm-base.svg\n[npm-url]: https://npmjs.org/package/screwdriver-scm-base\n[downloads-image]: https://img.shields.io/npm/dt/screwdriver-scm-base.svg\n[license-image]: https://img.shields.io/npm/l/screwdriver-scm-base.svg\n[issues-image]: https://img.shields.io/github/issues/screwdriver-cd/screwdriver.svg\n[issues-url]: https://github.com/screwdriver-cd/screwdriver/issues\n[status-image]: https://cd.screwdriver.cd/pipelines/10/badge\n[status-url]: https://cd.screwdriver.cd/pipelines/10\n[bell]: https://www.npmjs.com/package/bell\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscrewdriver-cd%2Fscm-base","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscrewdriver-cd%2Fscm-base","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscrewdriver-cd%2Fscm-base/lists"}